初始化

dep_wangsr
liulb@mesnac.com
parent a7cd01cbef
commit 2f0a1d1fb5

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "5.0.10",
"commands": [
"dotnet-ef"
]
}
}
}

@ -0,0 +1,64 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<UserSecretsId>f2c056a5-cf55-471c-aabd-31d46af19fce</UserSecretsId>
<OutputType>Exe</OutputType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>..\Admin.Core.Api\Admin.Core.Api.xml</DocumentationFile>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Log\**" />
<Compile Remove="upload\**" />
<Content Remove="Log\**" />
<Content Remove="upload\**" />
<EmbeddedResource Remove="Log\**" />
<EmbeddedResource Remove="upload\**" />
<None Remove="Log\**" />
<None Remove="upload\**" />
</ItemGroup>
<ItemGroup>
<None Remove="index.html" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="index.html" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.9" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Admin.Core.Extensions\Admin.Core.Extensions.csproj" />
<ProjectReference Include="..\Admin.Core.Plc\Admin.Core.Plc.csproj" />
<ProjectReference Include="..\Admin.Core.Service\Admin.Core.Service.csproj" />
<ProjectReference Include="..\Admin.Core.Tasks\Admin.Core.Tasks.csproj" />
<ProjectReference Include="..\S71500\S71500.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="file\" />
</ItemGroup>
<ItemGroup>
<None Update="Admin.Core.Api.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Admin.Core.Model.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="key-2b589034-183c-46aa-9a57-6462be1caa2e.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
</Project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,128 @@
using Admin.Core.Model;
using Admin.Core.Common;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace Admin.Core.Api
{
/// <summary>
/// BaseApiCpntroller
/// </summary>
public class BaseApiController : Controller
{
/// <summary>
/// Success
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
[NonAction]
public MessageModel<T> Success<T>(T data, string msg = "成功")
{
return new MessageModel<T>()
{
success = true,
msg = msg,
data = data,
};
}
/// <summary>
/// Success
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
[NonAction]
public MessageModel Success(string msg = "成功")
{
return new MessageModel()
{
success = true,
msg = msg,
data = null,
};
}
/// <summary>
/// Failed
/// </summary>
/// <param name="msg"></param>
/// <param name="status"></param>
/// <returns></returns>
[NonAction]
public MessageModel<string> Failed(string msg = "失败", int status = 500)
{
return new MessageModel<string>()
{
success = false,
status = status,
msg = msg,
data = null,
};
}
/// <summary>
/// Failed
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="msg"></param>
/// <param name="status"></param>
/// <returns></returns>
[NonAction]
public MessageModel<T> Failed<T>(string msg = "失败", int status = 500)
{
return new MessageModel<T>()
{
success = false,
status = status,
msg = msg,
data = default,
};
}
/// <summary>
/// SuccessPage
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="page"></param>
/// <param name="dataCount"></param>
/// <param name="pageSize"></param>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
[NonAction]
public MessageModel<PageModel<T>> SuccessPage<T>(int page, int dataCount, int pageSize, List<T> data, string msg = "获取成功")
{
return new MessageModel<PageModel<T>>()
{
success = true,
msg = msg,
data = new PageModel<T>()
{
page = page,
dataCount = dataCount,
data = data,
pageSize = pageSize
}
};
}
/// <summary>
/// SuccessPage
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pageModel"></param>
/// <param name="msg"></param>
/// <returns></returns>
[NonAction]
public MessageModel<PageModel<T>> SuccessPage<T>(PageModel<T> pageModel, string msg = "获取成功")
{
return new MessageModel<PageModel<T>>()
{
success = true,
msg = msg,
data = pageModel
};
}
}
}

@ -0,0 +1,65 @@
using Admin.Core.Common;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// BaseApiCpntroller
/// </summary>
public class BaseApiUserController : BaseApiController
{
/// <summary>
/// ISysUserService
/// </summary>
public ISysUserService _sysUserService;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sysUserService"></param>
public BaseApiUserController(ISysUserService sysUserService)
{
_sysUserService = sysUserService;
}
/// <summary>
/// 获取当前登录用户信息
/// </summary>
/// <returns></returns>
public SysUser CurrentUser
{
get
{
var currentUser = new SysUser { LoginName = string.Empty };
var loginName = HttpContext.User.Identity.Name;
if (loginName.IsNotEmptyOrNull())
{
int.TryParse(ClaimHelper.Get(HttpContext, ClaimTypes.Sid), out int userId);
currentUser.UserID = userId;
currentUser.LoginName = loginName;
//var key = "Admin.Core." + currentUser.UserID;
//currentUser = OperatorProvider.GetCurrent(HttpContext, "1");
//if (!currentUser.IsNotEmptyOrNull())
//{
// currentUser = _sysUserService.QueryById(userId).Result;
// if (currentUser.IsNotEmptyOrNull())
// {
// OperatorProvider.AddCurrent(HttpContext, key, currentUser);
// }
//}
}
return currentUser;
}
}
}
}

@ -0,0 +1,192 @@
using Admin.Core.Common;
using Admin.Core.Extensions;
using Admin.Core.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Admin.Core.Api
{
/// <summary>
/// 缓存监控
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class CacheController : BaseApiController
{
readonly IRedisBasketRepository _redisBasketRepository;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="redisBasketRepository"></param>
public CacheController(IRedisBasketRepository redisBasketRepository)
{
_redisBasketRepository = redisBasketRepository;
}
/// <summary>
/// 获取缓存详情
/// </summary>
/// <returns></returns>
[HttpPost]
public MessageModel<PageModel<RedisKeyView>> GetList([FromBody] PageQuery<RedisKeyView> pageQuery)
{
var redisKeys = _redisBasketRepository.GetAllKes();
if (pageQuery.Query.Server.IsNotEmptyOrNull())
{
redisKeys = redisKeys.FindAll(x => x.Server.Contains(pageQuery.Query.Server));
}
if (pageQuery.Query.Point.IsNotEmptyOrNull())
{
redisKeys = redisKeys.FindAll(x => x.Point.Contains(pageQuery.Query.Point));
}
if (pageQuery.Query.Key.IsNotEmptyOrNull())
{
redisKeys = redisKeys.FindAll(x => x.Key.Contains(pageQuery.Query.Key));
}
PageModel<RedisKeyView> pageModel = new PageModel<RedisKeyView>()
{
dataCount = redisKeys.Count,
data = redisKeys.Skip(pageQuery.PageSize * (pageQuery.Page - 1)).Take(pageQuery.PageSize).ToList()
};
return Success(pageModel);
}
/// <summary>
/// 获取缓存服务列表详情
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<List<RedisServerView>> GetServerList()
{
var redisKeys = _redisBasketRepository.GetAllKes();
List<RedisServerView> redisServers = new List<RedisServerView>();
var servers = redisKeys.Select(x => x.Server).Distinct();
foreach (var item in servers)
{
RedisServerView view = new RedisServerView()
{
Server = item,
Points = redisKeys.FindAll(x => x.Server == item).Select(m => m.Point).Distinct().ToList(),
};
List<Pointkey> pointkeys = new List<Pointkey>();
foreach (var point in view.Points)
{
Pointkey pointkey = new Pointkey()
{
Point = point,
Key = redisKeys.FindAll(x => x.Point == point).Select(m => m.Key).Distinct().ToList(),
};
pointkeys.Add(pointkey);
}
view.Pointkeys = pointkeys;
redisServers.Add(view);
}
return Success(redisServers);
}
/// <summary>
/// 获取缓存Key列表详情
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<PageModel<string>> GetKeyList([FromBody] PageQuery<RedisKeyView> pageQuery)
{
var redisKeys = _redisBasketRepository.GetAllKes();
var keys = redisKeys.Select(x => x.Key).Distinct().ToList();
if (pageQuery.Query.Key.IsNotEmptyOrNull())
{
keys = keys.FindAll(x => x.Contains(pageQuery.Query.Key));
}
PageModel<string> pageModel = new PageModel<string>()
{
dataCount = redisKeys.Count,
data = keys.Skip(pageQuery.PageSize * (pageQuery.Page - 1)).Take(pageQuery.PageSize).ToList()
};
return Success(pageModel);
}
/// <summary>
/// 获取基础信息
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<RedisBaseView> GetBaseInfo()
{
return Success(_redisBasketRepository.GetBaseInfo());
}
/// <summary>
/// 获取缓存值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> GetValue(string key)
{
return Success<string>(await _redisBasketRepository.GetValue(key));
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> Add(string key, string value)
{
return Success(await _redisBasketRepository.SetStr(key, value));
}
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> Del(string key)
{
return Success(await _redisBasketRepository.Remove(key));
}
/// <summary>
/// 清除所有缓存
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> DelAll()
{
await _redisBasketRepository.Clear();
return Success<string>("");
}
/// <summary>
/// 获取节点状态
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<List<PointStatus>> GetPointStatus()
{
var list = _redisBasketRepository.GetPointStatus();
var redisKeys = _redisBasketRepository.GetAllKes();
list.ForEach(item =>
{
item.Server = redisKeys.Find(x => x.Point == item.Point)?.Server;
item.KeyN = redisKeys.FindAll(x => x.Point == item.Point).Count;
});
return Success(list);
}
}
}

@ -0,0 +1,87 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq.Expressions;
using Admin.Core.Common;
using Microsoft.Extensions.Logging;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Admin.Core.IService.ISys;
namespace Admin.Core.Api
{
/// <summary>
/// SysDeptController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class CommonController : BaseApiUserController
{
/// <summary>
/// _SysDeptService
/// </summary>
private readonly ISysDeptService _SysDeptService;
private readonly ILogger<CommonController> _logger;
readonly ICaching caching;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysDeptService"></param>
/// <param name="logger"></param>
/// <param name="caching"></param>
/// <param name="sysUserService"></param>
public CommonController(ISysDeptService SysDeptService, ILogger<CommonController> logger, ICaching caching, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_SysDeptService = SysDeptService;
_logger = logger;
this.caching = caching;
}
/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Upload()
{
//获取Form提交的文件
var files = Request.Form.Files;
return await FileHelper.FileSaveByBlob(files);
}
/// <summary>
/// 测试1
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
[HttpGet]
public string Get(string str)
{
HttpContext.Session.SetString("code", str);
HttpContext.Session.SetString("code1", str);
HttpContext.Response.Cookies.Append("k1", "str");
CookieHelper.SetCookies(HttpContext, "k1", "jojo");
return "value";
}
/// <summary>
/// 测试2
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public string GetValue(string id)
{
var aa = CookieHelper.GetCookies(HttpContext, "k1");
return HttpContext.Session.GetString("code") + HttpContext.Session.GetString("code1");
}
}
}

@ -0,0 +1,326 @@
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.Extensions;
using Admin.Core.IService;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Model.Sys;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using UAParser;
namespace Admin.Core.Api
{
/// <summary>
/// 登录管理
/// </summary>
[Produces("application/json")]
[Route("api/Login")]
[Authorize(Permissions.Name)]
public class LoginController : BaseApiUserController
{
readonly ISysMenuService _sysMenuService;
readonly ISysPermissionService _sysPermissionService;
readonly ISysLoginInfoService _sysLoginInfoService;
readonly ICaptcha _captcha;
readonly ISysConfigService _sysConfigService;
readonly PermissionRequirement _requirement;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="sysUserService"></param>
/// <param name="sysMenuService"></param>
/// <param name="sysPermissionService"></param>
/// <param name="captcha"></param>
/// <param name="requirement"></param>
/// <param name="sysLoginInfoService"></param>
/// <param name="sysConfigService"></param>
public LoginController(ISysUserService sysUserService, ISysMenuService sysMenuService, ISysPermissionService sysPermissionService,
ICaptcha captcha, PermissionRequirement requirement, ISysLoginInfoService sysLoginInfoService,
ISysConfigService sysConfigService) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysMenuService = sysMenuService;
_sysPermissionService = sysPermissionService;
_sysLoginInfoService = sysLoginInfoService;
_captcha = captcha;
_sysConfigService = sysConfigService;
_requirement = requirement;
}
/// <summary>
/// 登录获取Token-JWT
/// </summary>
/// <param name="loginBody"></param>
/// <returns></returns>
[HttpPost]
[Route("Login")]
[AllowAnonymous]
public async Task<MessageModel<TokenInfoViewModel>> GetJwtToken([FromBody] LoginBody loginBody)
{
string jwtStr = string.Empty;
if (!loginBody.IsNotEmptyOrNull() || string.IsNullOrEmpty(loginBody.LoginName) || string.IsNullOrEmpty(loginBody.Password))
{
return Failed<TokenInfoViewModel>("用户名或密码不能为空");
}
// 验证码校验
var captchaOnOff = (await _sysConfigService.QueryAsync(x => x.ConfigKey == SysConst.KEY_OFF_CAPTCHA)).FirstOrDefault();
if (captchaOnOff.ConfigValue == "true")
{
if (!loginBody.Code.IsNotEmptyOrNull())
{
return Failed<TokenInfoViewModel>("验证码错误");
}
var code = CookieHelper.GetCookies(HttpContext, CacheKey.Captcha);
if (loginBody.Code.ToLower() != code.ToLower())
{
return Failed<TokenInfoViewModel>("验证码错误");
}
}
loginBody.Password = MD5Helper.MD5Encrypt32(loginBody.Password);
var user = (await _sysUserService.QueryAsync(d => d.LoginName == loginBody.LoginName && d.Password == loginBody.Password && d.DelFlag == false && d.Status == SysConst.ENABLE)).FirstOrDefault();
if (user.IsNotEmptyOrNull())
{
var userRoles = await _sysUserService.GetUserRoleNameStr(loginBody.LoginName, loginBody.Password);
//如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, user.LoginName.ToString()),
new Claim(ClaimTypes.Sid, user.UserID.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, user.UserID.ToString()),
new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) };
claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
//记录登录信息
await RecordLoginInfo(user);
return Success(token, "获取成功");
}
else
{
user = (await _sysUserService.QueryAsync(d => d.LoginName == loginBody.LoginName && d.DelFlag == false)).FirstOrDefault();
if (user == null)
{
return Failed<TokenInfoViewModel>("用户不存在");
}
user = (await _sysUserService.QueryAsync(d => d.LoginName == loginBody.LoginName && d.DelFlag == false && d.Status == SysConst.DISABLE)).FirstOrDefault();
if (user != null)
{
return Failed<TokenInfoViewModel>("用户处于禁用状态");
}
return Failed<TokenInfoViewModel>("用户名或密码错误");
}
}
/// <summary>
/// 默认使用管理员账号登录获取Token-JWT
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("LoginAdmin")]
[AllowAnonymous]
public async Task<MessageModel<TokenInfoViewModel>> GetJwtTokenAdmin()
{
// 是否开启测试环境
var isTestCurrent = Appsettings.app(new string[] { "AppSettings", "UseLoadTest" }).ObjToBool();
if (!isTestCurrent) return Failed<TokenInfoViewModel>("测试环境未开启");
string jwtStr = string.Empty;
//管理员账号信息
string loginName = "admin";
string password = "Password01!";
password = MD5Helper.MD5Encrypt32(password);
var user = (await _sysUserService.QueryAsync(d => d.LoginName == loginName && d.Password == password && d.DelFlag == false && d.Status == SysConst.ENABLE)).FirstOrDefault();
if (user.IsNotEmptyOrNull())
{
var userRoles = await _sysUserService.GetUserRoleNameStr(loginName, password);
//如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, user.LoginName.ToString()),
new Claim(ClaimTypes.Sid, user.UserID.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, user.UserID.ToString()),
new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) };
claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
return Success(token, "获取成功");
}
else
{
return Failed<TokenInfoViewModel>("认证失败");
}
}
/// <summary>
/// 请求刷新Token以旧换新
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Route("RefreshToken")]
[AllowAnonymous]
public async Task<MessageModel<TokenInfoViewModel>> RefreshToken(string token = "")
{
string jwtStr = string.Empty;
if (string.IsNullOrEmpty(token))
return Failed<TokenInfoViewModel>("token无效请重新登录");
var tokenModel = JwtHelper.SerializeJwt(token);
if (tokenModel != null && tokenModel.Uid > 0)
{
var user = await _sysUserService.QueryByIdAsync(tokenModel.Uid);
if (user != null)
{
var userRoles = await _sysUserService.GetUserRoleNameStr(user.LoginName, user.Password);
//如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, tokenModel.Uid.ObjToString()),
new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ObjToString()),
new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) };
claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
//用户标识
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
identity.AddClaims(claims);
var refreshToken = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
return Success(refreshToken, "获取成功");
}
}
return Failed<TokenInfoViewModel>("认证失败!");
}
/// <summary>
/// 获取用户信息
/// </summary>
/// <returns> 用户信息 </returns>
[HttpGet]
[Route("GetUserInfo")]
public async Task<MessageModel<UserPermission>> GetUserInfo()
{
UserPermission userPermission = new UserPermission()
{
SysUser = await _sysUserService.QueryByIdAsync(CurrentUser.UserID),
Perms = await _sysPermissionService.GetMenuPermission(CurrentUser.UserID),
Roles = await _sysPermissionService.GetRolePermission(CurrentUser.UserID)
};
return Success(userPermission);
}
/// <summary>
/// 获取路由信息
/// </summary>
/// <returns> 路由信息 </returns>
[HttpGet]
[Route("GetRouters")]
public async Task<MessageModel<List<RouterVo>>> GetRouters()
{
var menus = await _sysMenuService.SelectMenuTreeByUserId(CurrentUser.UserID);
return Success(_sysMenuService.BuildMenus(menus));
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="_captcha"></param>
/// <returns></returns>
[HttpGet]
[Route("Captcha")]
[AllowAnonymous]
public async Task<FileContentResult> Captcha()
{
var code = await _captcha.GenerateRandomCaptcha();
var result = await _captcha.GenerateCaptchaImage(code);
// 将验证码的token放入cookie
CookieHelper.SetCookies(HttpContext, CacheKey.Captcha, code);
return File(result.CaptchaMemoryStream.ToArray(), "image/png");
}
/// <summary>
/// 退出登录
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
[HttpPost]
[Route("Logout")]
[AllowAnonymous]
public MessageModel<bool> Logout(string token = "")
{
var refresh = RefreshToken(token).Result;
return Success(refresh.data.IsNotEmptyOrNull() && refresh.data.token.IsNotEmptyOrNull());
}
/// <summary>
/// 用户注册
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
[Route("Register")]
[AllowAnonymous]
public async Task<MessageModel<bool>> Register([FromBody] SysUser user)
{
MessageModel<bool> model = new MessageModel<bool>();
if (await _sysUserService.CheckLoginNameUnique(user.LoginName))
{
model.success = false;
model.msg = "登录账号已存在!";
return model;
}
user.Password = MD5Helper.MD5Encrypt32(user.Password);
user.UserType = "00";
user.DelFlag = false;
user.CreateTime = DateTime.Now;
user.UpdateTime = DateTime.Now;
user.CreateBy = user.LoginName;
user.UpdateBy = user.LoginName;
user.Status = SysConst.ENABLE;
user.Sex = 0;
return Success(await _sysUserService.AddAsync(user) > 0);
}
/// <summary>
/// 记录登录信息
/// </summary>
/// <param name="user"></param>
[NonAction]
public async Task RecordLoginInfo(SysUser user)
{
user.LoginIP = IpHelper.GetIpAddr(HttpContext);
user.LoginDate = DateTime.Now;
await _sysUserService.UpdateAsync(user);
var agent = HttpContext.Request.Headers["User-Agent"].ObjToString();
var parser = Parser.GetDefault();
var info = parser.Parse(agent);
SysLoginInfo loginInfo = new SysLoginInfo()
{
UserName = user.LoginName,
IPAddr = user.LoginIP,
LoginLocation = AddressHelper.GetRealAddressByIP(user.LoginIP),
Browser = info.UA.Family,
OS = info.OS.Family,
Status = SysConst.SUCCESS,
Msg = user.UserName,
LoginTime = DateTime.Now
};
await _sysLoginInfoService.AddAsync(loginInfo);
}
}
}

@ -0,0 +1,228 @@
using Admin.Core.IService;
using Admin.Core.Service;
using Admin.Core.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using S71500.Impl;
using Admin.Core.Model.ViewModels;
using log4net;
namespace Admin.Core.Api
{
/// <summary>
/// 小料料仓类型放差错
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
[AllowAnonymous]
public class xl_materialController : BaseApiController
{
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(xl_materialServices));
int i = 0;
/// <summary>
/// 物料服务
/// </summary>
private readonly Ixl_materialServices _xl_materialService;
private readonly IPmt_BinServices _binServices;
private readonly IXlPlanServices _xlPlanServices;
#region 构造方法
/// <summary>
/// 构造方法
/// </summary>
/// <param></param>
public xl_materialController(Ixl_materialServices xl_materialServices, IPmt_BinServices binServices,
IXlPlanServices xlPlanServices)
{
_xl_materialService = xl_materialServices;
_binServices = binServices;
_xlPlanServices = xlPlanServices;
_xlPlanServices = xlPlanServices;
}
#endregion
#region 根据扫描的二维码查询小料物料
/// <summary>
/// 根据扫描的二维码查询小料物料
/// </summary>
/// <param name="code">物料条码信息</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<xl_material>> GetByMaterialCode(string code)
{
if (!code.IsNotEmptyOrNull())
{
return Failed<xl_material>("传入参数为空!");
}
var query = await _xl_materialService.GetByMaterialCode(code.Trim());
log.Info(query == null);
if (query == null)
{
return Failed<xl_material>("查询失败!");
}
return Success(query);
}
#endregion
#region 根据扫描的二维码查询料仓
/// <summary>
/// 根据扫描的二维码查询料仓
/// </summary>
/// <param name="code">料仓条码信息</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<BinView>> GetByBinCode(string code)
{
BinView view=new BinView();
log.Info(code);
if (!code.IsNotEmptyOrNull())
{
return Failed<BinView>("传入参数为空!");
}
var binList = await _binServices.QueryAsync();
var bin = binList.FirstOrDefault(d=>d.Bin_Code.Trim() == code.Trim());
if (bin == null) return Failed<BinView>("未查询到桶信息!");
var _materialList = await _xl_materialService.QueryAsync(d => d.IsEnable == "是");
xl_material mater = _materialList.Where(d => d.ID == bin.Material_ID).Take(1).FirstOrDefault(d => d.ID == bin.Material_ID);
if (_materialList == null) return Failed<BinView>("未查询到物料信息!");
view.Bin_Serial = bin.Bin_Serial;
view.Bin_Name = bin.Bin_Name;
view.Bin_Code = bin.Bin_Code;
view.Material_ID = mater.Material_code;
view.Material_Name = mater.Material_name;
view.Material_code = mater.Material_code;
return Success(view);
}
#endregion
#region 执行PLC
/// <summary>
/// <param name="code">料仓排序Bin_Serial</param>
/// <param name="state">匹配状态条码匹配写“1”不匹配时写“2”</param>
/// <param name="materialCode">物料编码</param>
/// <param name="weight">物料重量</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> ExecPlcCode(int code, int state,string materialCode,decimal weight)
{
//log.Info(code + "&" + state);
if (!code.IsNotEmptyOrNull())
{
return Failed<bool>("料仓条码信息传入参数为空!");
}
if (!state.IsNotEmptyOrNull())
{
return Failed<bool>("匹配状态传入参数为空!");
}
if (!materialCode.IsNotEmptyOrNull())
{
return Failed<bool>("匹配状态传入参数为空!");
}
if (!weight.IsNotEmptyOrNull())
{
return Failed<bool>("匹配状态传入参数为空!");
}
var result = await _xl_materialService.ExecPlcState(code, state, materialCode, weight);
if (result)
{
return Success(result);
}
return Failed<bool>("执行失败!");
}
#endregion
#region 检量称扫码绑定桶(新加)
/// <summary>
/// 检量称扫码绑定桶(新加)
/// </summary>
/// <param name="code">桶条码</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> BindBarrel(string code)
{
if (!code.IsNotEmptyOrNull())
return Failed<bool>("桶条码信息传入参数为空!");
var result = await _xl_materialService.BindBarrel(code.Trim());
if (result == 0)
return Failed<bool>("未查询到正在执行的计划!");
if (result == 1)
return Failed<bool>("未查询到桶!");
if (result == 2)
return Failed<bool>($"未查询到[{code}]桶信息!");
if (result == 3)
return Failed<bool>("该桶已经绑定物料,请联系系统管理员处理!");
if (result == 6)
return Success(true);
if (result == 7)
return Failed<bool>("称重未完成!");
if (result == 8)
return Failed<bool>("PLC连接失败请检查PLC或者联系管理员处理");
if (result == 10)
return Failed<bool>("未知异常,请查看错误日志!");
if (result == 99)
return Failed<bool>("保存处理数据失败!");
if (result == 100)
return Failed<bool>("处理中....");
if (result == 110)
return Failed<bool>("执行批次未获取!");
return Failed<bool>("执行失败!");
}
#endregion
#region 测试
/// <summary>
/// 测试
/// </summary>
/// <returns></returns>
[HttpGet]
public Task<int> BindBarrel2()
{
decimal we2 = Convert.ToDecimal(Adapter.ReadInt16("DB104.DBW164")) / 100;//检量秤重量
int tcheckBatch = Adapter.ReadInt32("DB110.DBW212");//当前执行的车次
return Task.FromResult(tcheckBatch);
}
#endregion
#region 获取所有小料计划订单
/// <summary>
/// 获取所有小料计划订单
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<AllXlPlanView>>> GetXlPlanInfo()
{
MessageModel<List<AllXlPlanView>> message=new MessageModel<List<AllXlPlanView>>();
var list= await _xlPlanServices.GetAllXlPlanInfo();
if (list.Count>0)
{
message.success = true;
message.data = list;
}
else
{
message.success = false;
message.msg = "未查询到计划数据!";
}
return message;
}
#endregion
}
}

@ -0,0 +1,163 @@
using Admin.Core.IService;
using Admin.Core.Service;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.Service.Sys;
using Admin.Core.Model.ViewModels;
using System.Collections;
using NPOI.SS.Formula.Functions;
using System.Numerics;
namespace Admin.Core.Api
{
/// <summary>
/// 溶剂称量 PDA接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[AllowAnonymous]
public class SolventController : BaseApiUserController
{
private readonly ISolventServices _solventServices;
#region 构造函数
/// <summary>
/// 构造函数
/// </summary>
public SolventController(ISysUserService sysUserService, ISolventServices solventServices) : base(sysUserService)
{
_sysUserService = sysUserService;
this._solventServices = solventServices;
}
#endregion
#region 拉缸验证物料
/// <summary>
/// 根据拉缸条码查询物料
/// </summary>
/// <param name="code">缸条码</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<WaitePlanView>> GetByCylinderInfo(string code)
{
string weighbridge = "1号地磅";
if (!code.IsNotEmptyOrNull())
{
return Failed<WaitePlanView>("传入参数为空!");
}
var query = await _solventServices.GetByCylinderCode(code.Trim(),weighbridge);
if (query == null)
{
return Failed<WaitePlanView>("查询失败!");
}
return Success(query);
}
/// <summary>
/// 拉缸执行PLC更改状态
/// </summary>
/// <param name="view"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> ExecPlcState([FromBody] VerifyView view)
{
if (!view.IsNotEmptyOrNull())
{
return Failed<bool>("传入参数为空!");
}
view.Weighbridge = "1号地磅";
var result = await _solventServices.ExecPlcState(view);
if (result)
{
return Success(result);
}
return Failed<bool>("执行失败!");
}
#endregion
#region 根据泵条码比对拉缸条码
/// <summary>
/// 根据泵条码比对拉缸条码
/// </summary>
/// <param name="code">泵条码</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<PumpAndCylinderView>> GetByPumpInfo(string code)
{
if (!code.IsNotEmptyOrNull())
{
return Failed<PumpAndCylinderView>("传入参数为空!");
}
var query = await _solventServices.GetByPumpCode(code.Trim());
if (query == null)
{
return Failed<PumpAndCylinderView>("查询失败!");
}
return Success(query);
}
/// <summary>
/// 对比泵和拉缸条码匹配成功执行
/// </summary>
/// <param name="planId">计划ID</param>
/// <param name="pumpCode">泵Code</param>
/// <param name="cylinderCode">拉缸Code</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> ExecState(string planId, string pumpCode, string cylinderCode)
{
if (!planId.IsNotEmptyOrNull())
{
return Failed<bool>("传入计划参数为空!");
}
if (!pumpCode.IsNotEmptyOrNull())
{
return Failed<bool>("传入泵参数为空!");
}
if (!cylinderCode.IsNotEmptyOrNull())
{
return Failed<bool>("传入拉缸参数为空!");
}
var query = await _solventServices.ExecState(planId, pumpCode.Trim(), cylinderCode.Trim());
if (query)
{
return Success(query);
}
return Failed<bool>("查询失败!");
}
#endregion
#region 获取所有溶剂计划
/// <summary>
/// 获取所有溶剂计划
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<SolventPlanView>>> GetSolventPlanInfo()
{
MessageModel<List<SolventPlanView>> message = new MessageModel<List<SolventPlanView>>();
var list = await _solventServices.GetSolventPlanInfo();
if (list.Count > 0)
{
message.success = true;
message.data = list;
}
else
{
message.success = false;
message.msg = "未查询到计划数据!";
}
return message;
}
#endregion
}
}

@ -0,0 +1,138 @@
using Admin.Core.IService;
using Admin.Core.Service;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using Admin.Core.Model.ViewModels;
using Microsoft.AspNetCore.Mvc.ViewEngines;
using System.Collections;
namespace Admin.Core.Api.Controllers.Business
{
/// <summary>
/// 反应釜防错验证
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[AllowAnonymous]
public class WarehouseController : BaseApiUserController
{
#region 整包信息
//000524-20230805-0001-CF-130|25kg
//000524:为物料编码
//CF-130:物料名称
//25kg物料重量
#endregion
/// <summary>
/// 投料仓服务
/// </summary>
private readonly IHw_WarehouseServices _hw_WarehouseService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="hw_WarehouseServices"></param>
/// <param name="sysUserService"></param>
public WarehouseController(IHw_WarehouseServices hw_WarehouseServices, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_hw_WarehouseService = hw_WarehouseServices;
}
#region 获取反应釜所有计划号
///// <summary>
///// 获取反应釜所有计划号
///// </summary>
///// <returns></returns>
//[HttpGet]
//public async Task<MessageModel<List<string>>> GetAllPlan()
//{
// var query = await _hw_WarehouseService.GetPlan();
// if (query == null)
// {
// return Failed<List<string>>("未查询到计划号!");
// }
// return Success(query);
//}
#endregion
#region 扫描料桶条码 获取桶绑定物料信息
/// <summary>
/// 扫描料桶条码 获取桶绑定物料信息
/// </summary>
/// <param name="code">桶条码</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<BarrelView>> GetByBarrelInfo(string code)
{
if (!code.IsNotEmptyOrNull())
{
return Failed<BarrelView>("传入参数为空!");
}
var query = await _hw_WarehouseService.GetXlInfo(code.Trim());
if (query == null)
{
return Failed<BarrelView>("查询失败!");
}
return Success(query);
}
#endregion
#region 根据条码查询投料釜设置的物料
/// <summary>
/// 根据条码查询投料釜设置的物料
/// </summary>
/// <param name="code">投料釜条码</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<WarehouseView>> GetByCode(string code)
{
if (!code.IsNotEmptyOrNull())
{
return Failed<WarehouseView>("传入参数为空!");
}
var query = await _hw_WarehouseService.QueryByCode(code.Trim());
if (query==null)
{
return Failed<WarehouseView>("查询失败!");
}
return Success(query);
}
#endregion
#region PLC更新状态——反应釜
/// <summary>
/// PLC更新状态——反应釜
/// </summary>
/// <param name="view">json 对象</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> ExecPlcState([FromBody] KettleView view)
{
if (!view.IsNotEmptyOrNull())
{
return Failed<bool>("传入参数为空!");
}
var result = await _hw_WarehouseService.UpdatePlcState(view);
if (result)
{
return Success(result);
}
return Failed<bool>("执行失败!");
}
#endregion
}
}

@ -0,0 +1,108 @@
using Admin.Core.Common;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Admin.Core.Api
{
/// <summary>
/// Controller代码生成
/// </summary>
[ApiController]
[Route("api/[controller]/[action]")]
[AllowAnonymous]
public class SeedController : ControllerBase
{
private readonly SqlSugarClient _sqlSugarClient;
private readonly IWebHostEnvironment Env;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="sqlSugarClient"></param>
/// <param name="env"></param>
public SeedController(ISqlSugarClient sqlSugarClient, IWebHostEnvironment env)
{
_sqlSugarClient = sqlSugarClient as SqlSugarClient;
Env = env;
}
/// <summary>
/// 获取控制器(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public string GetFrameFilesByTableNamesForController([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool();
var seed = FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames);
var data = $"库{ConnID}-Controllers层生成{seed}";
return data;
}
/// <summary>
/// 获取实体(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public string GetFrameFilesByTableNamesForEntity([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool();
var data = $"库{ConnID}-Models层生成{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)}";
return data;
}
/// <summary>
/// 获取控制器、服务、仓储、实体(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public string GetFrameFilesByTableNames([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
try
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool();
FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames);
FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames);
FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames);
FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames);
FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames);
FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames);
var data = $"库{ConnID}-控制器、服务、仓储、实体层生成";
return data;
}
catch (Exception)
{
throw;
}
}
}
}

@ -0,0 +1,193 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Linq;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysConfigController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysConfigController : BaseApiUserController
{
/// <summary>
/// _sysConfigService
/// </summary>
private readonly ISysConfigService _sysConfigService;
private const int i=0;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysConfigService"></param>
/// <param name="sysUserService"></param>
public SysConfigController(ISysConfigService SysConfigService, ISysUserService sysUserService) : base(sysUserService)
{
_sysConfigService = SysConfigService;
_sysUserService = sysUserService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
[Action("参数设置", ActionType.QUERY)]
public async Task<MessageModel<PageModel<SysConfig>>> GetByPage([FromBody] PageQuery<SysConfig> pageQuery)
{
Expression<Func<SysConfig, bool>> whereExpression = x => true;
if (pageQuery.Query.ConfigName.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.ConfigName.Contains(pageQuery.Query.ConfigName));
}
if (pageQuery.Query.ConfigKey.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.ConfigKey.Contains(pageQuery.Query.ConfigKey));
}
if (pageQuery.Query.CreateBy.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.CreateBy.Contains(pageQuery.Query.CreateBy));
}
if (pageQuery.Query.ConfigType.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.ConfigType == pageQuery.Query.ConfigType);
}
var data = await _sysConfigService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, "ConfigID asc");
return Success(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysConfig>> GetByID(int id)
{
return new MessageModel<SysConfig>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysConfigService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysConfig</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysConfig request)
{
var data = new MessageModel<int>();
if (await _sysConfigService.CheckConfigKeyUnique(request))
{
data.success = false;
data.msg = "参数键名已存在";
return data;
}
request.CreateTime = DateTime.Now;
request.UpdateTime = DateTime.Now;
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
data.data = await _sysConfigService.AddAsync(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysConfig</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysConfig request)
{
var data = new MessageModel<bool>();
if (await _sysConfigService.CheckConfigKeyUnique(request))
{
data.success = false;
data.msg = "参数键名已存在";
return data;
}
request.UpdateTime = DateTime.Now;
request.UpdateBy = CurrentUser.LoginName;
data.success = await _sysConfigService.UpdateAsync(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysConfigService.DeleteByIdAsync(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 根据参数键名查询参数值
/// </summary>
/// <param name="configKey"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<MessageModel<string>> GetConfigKey(string configKey)
{
var config = await _sysConfigService.QueryAsync(x => x.ConfigKey == configKey);
return Success<string>(config.FirstOrDefault().ConfigValue);
}
}
}

@ -0,0 +1,262 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using AutoMapper;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysDeptController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysDeptController : BaseApiUserController
{
/// <summary>
/// _sysDeptService
/// </summary>
private readonly ISysDeptService _sysDeptService;
private readonly ISysRoleDeptService _sysRoleDeptService;
private readonly IMapper _mapper;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysDeptService"></param>
/// <param name="sysRoleDeptService"></param>
/// <param name="sysUserService"></param>
/// <param name="mapper"></param>
public SysDeptController(ISysDeptService SysDeptService, ISysRoleDeptService sysRoleDeptService, ISysUserService sysUserService,
IMapper mapper) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysDeptService = SysDeptService;
_sysRoleDeptService = sysRoleDeptService;
_mapper = mapper;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<DeptView>>> GetByPage([FromBody] PageQuery<SysDept> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new SysDept();
}
var model = await _sysDeptService.SelectDeptList(pageQuery);
return SuccessPage(model);
}
/// <summary>
/// 查询所有部门信息
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<SysDept>>> GetAll()
{
return Success(await _sysDeptService.QueryAsync());
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysDept>> GetByID(int id)
{
return new MessageModel<SysDept>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysDeptService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysDept</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysDept request)
{
var data = new MessageModel<int>();
if (!await _sysDeptService.CheckDeptNameUnique(request))
{
data.success = false;
data.msg = "部门名称已存在!";
return data;
}
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
data.data = await _sysDeptService.InsertDept(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysDept</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysDept request)
{
var data = new MessageModel<bool>();
if (!await _sysDeptService.CheckDeptNameUnique(request))
{
data.success = false;
data.msg = "部门名称已存在!";
return data;
}
else if (request.ParentID == request.DeptID)
{
data.success = false;
data.msg = "上级部门不能是自己!";
return data;
}
else if (request.Status == SysConst.DISABLE)
{
//禁用部门需先禁用所有子部门
var existChildren = await _sysDeptService.SelectNormalChildrenDeptById(request.DeptID);
if (existChildren > 0)
{
data.success = false;
data.msg = "该部门包含未停用的子部门!";
return data;
}
}
data.success = await _sysDeptService.UpdateDept(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(int id)
{
var data = new MessageModel<bool>();
if (await _sysDeptService.HasChildByDeptId(id))
{
data.success = false;
data.msg = "存在下级部门,不允许删除!";
return data;
}
if (await _sysDeptService.CheckDeptExistUser(id))
{
data.success = false;
data.msg = "部门存在用户,不允许删除!";
return data;
}
data.success = await _sysDeptService.DeleteDeptById(id, CurrentUser.LoginName);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 查询部门列表(排除节点)
/// </summary>
[HttpGet]
public async Task<MessageModel<List<TreeSelect>>> ExcludeChild(int deptId)
{
var detptList = new List<SysDept>();
var depts = await _sysDeptService.SelectDeptAll();
foreach (var item in depts)
{
if (item.DeptID != deptId && item.Ancestors.IsNotEmptyOrNull() && !item.Ancestors.Split(",").Contains(deptId.ToString()))
{
detptList.Add(item);
}
}
return Success(_sysDeptService.BuildDeptTreeSelect(detptList));
}
/// <summary>
/// 获取部门下拉树列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<TreeSelect>>> TreeSelect()
{
var depts = await _sysDeptService.SelectDeptAll();
return Success(_sysDeptService.BuildDeptTreeSelect(depts));
}
/// <summary>
/// 获取部门下拉树列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<TreeSelect>>> TreeSelectByPid(int id)
{
var depts = await _sysDeptService.QueryAsync(x => x.DelFlag == false && x.Status == SysConst.ENABLE && x.ParentID == id);
return Success(_sysDeptService.BuildDeptTreeSelect(depts));
}
/// <summary>
/// 加载对应角色部门列表树
/// </summary>
[HttpGet]
public async Task<MessageModel<TreeNode>> RoleDeptTreeSelect(int roleId)
{
var depts = await _sysDeptService.SelectDeptAll();
var roleDepts = await _sysRoleDeptService.QueryAsync(x => x.RoleID == roleId);
TreeNode tree = new TreeNode()
{
CheckedKeys = roleDepts.Select(x => (int)x.DeptID).ToList(),
TreeSelects = _sysDeptService.BuildDeptTreeSelect(depts)
};
return Success(tree);
}
}
}

@ -0,0 +1,155 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysDictDataController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysDictDataController : BaseApiUserController
{
/// <summary>
/// _sysDictDataService
/// </summary>
private readonly ISysDictDataService _sysDictDataService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysDictDataService"></param>
/// <param name="sysUserService"></param>
public SysDictDataController(ISysDictDataService SysDictDataService, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysDictDataService = SysDictDataService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysDictData>>> GetByPage([FromBody] PageQuery<SysDictData> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new SysDictData();
}
var model = await _sysDictDataService.SelectDictDataList(pageQuery);
return Success(model);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysDictData>> GetByID(int id)
{
return new MessageModel<SysDictData>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysDictDataService.SelectDictDataById(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysDictData</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysDictData request)
{
var data = new MessageModel<int>();
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
data.data = await _sysDictDataService.InsertDictData(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysDictData</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysDictData request)
{
var data = new MessageModel<bool>();
request.UpdateBy = CurrentUser.LoginName;
data.success = await _sysDictDataService.UpdateDictData(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysDictDataService.DeleteDictDataByIds(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 根据字典类型查询字典数据信息
/// </summary>
/// <param name="dictType"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<SysDictData>>> DictType(string dictType)
{
return Success(await _sysDictDataService.QueryAsync(x => x.DictType == dictType && x.Status == SysConst.ENABLE));
}
}
}

@ -0,0 +1,180 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysDictTypeController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysDictTypeController : BaseApiUserController
{
/// <summary>
/// _sysDictTypeService
/// </summary>
private readonly ISysDictTypeService _sysDictTypeService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysDictTypeService"></param>
/// <param name="sysUserService"></param>
public SysDictTypeController(ISysDictTypeService SysDictTypeService, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysDictTypeService = SysDictTypeService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysDictType>>> GetByPage([FromBody] PageQuery<SysDictType> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new SysDictType();
}
var model = await _sysDictTypeService.SelectDictTypeList(pageQuery);
return Success(model);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysDictType>> GetByID(int id)
{
return new MessageModel<SysDictType>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysDictTypeService.SelectDictTypeById(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysDictType</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysDictType request)
{
var data = new MessageModel<int>();
if (!await _sysDictTypeService.CheckDictNameUnique(request))
{
data.success = false;
data.msg = "字典名称已存在!";
return data;
}
if (!await _sysDictTypeService.CheckDictTypeUnique(request))
{
data.success = false;
data.msg = "字典类型已存在!";
return data;
}
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
data.data = await _sysDictTypeService.InsertDictType(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysDictType</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysDictType request)
{
var data = new MessageModel<bool>();
if (!await _sysDictTypeService.CheckDictNameUnique(request))
{
data.success = false;
data.msg = "字典名称已存在!";
return data;
}
if (!await _sysDictTypeService.CheckDictTypeUnique(request))
{
data.success = false;
data.msg = "字典类型已存在!";
return data;
}
request.UpdateBy = CurrentUser.LoginName;
data.success = await _sysDictTypeService.UpdateDictType(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysDictTypeService.DeleteDictTypeByIds(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 获取字典选择框列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<SysDictType>>> OptionSelect()
{
return Success(await _sysDictTypeService.SelectDictTypeAll());
}
}
}

@ -0,0 +1,125 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.Common.Resource;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Model.Sys;
using Admin.Core.Repository;
using Admin.Core.Tasks;
using AutoMapper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Quartz;
namespace Admin.Core.Api
{
/// <summary>
/// 任务调度
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysJobLogController : BaseApiUserController
{
private readonly ISysJobLogService _sysJobLogService;
private readonly ISysTasksQzService _tasksQzService;
private readonly IMapper _mapper;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sysJobLogService"></param>
/// <param name="tasksQzService"></param>
/// <param name="mapper"></param>
/// <param name="sysUserService"></param>
public SysJobLogController(ISysJobLogService sysJobLogService, ISysTasksQzService tasksQzService, IMapper mapper, ISysUserService sysUserService) : base(sysUserService)
{
_sysJobLogService = sysJobLogService;
_sysUserService = sysUserService;
_mapper = mapper;
_tasksQzService = tasksQzService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<JobLogView>>> GetByPage([FromBody] PageQuery<JobLogView> pageQuery)
{
Expression<Func<SysTasksQz, bool>> whereExpression = x => x.DelFlag == false;
if (pageQuery.Query.TasksQz.ID != 0)
{
whereExpression = whereExpression.And(x => x.ID == pageQuery.Query.TasksQz.ID);
}
if (pageQuery.Query.TasksQz.Name.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Name.Contains(pageQuery.Query.TasksQz.Name));
}
if (pageQuery.Query.TasksQz.JobGroup.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.JobGroup == pageQuery.Query.TasksQz.JobGroup);
}
var taskQzs = await _tasksQzService.QueryAsync(whereExpression);
var taskIds = taskQzs.Select(x => x.ID).ToList();
Expression<Func<SysJobLog, bool>> whereExpressionLog = x => true;
whereExpressionLog = whereExpressionLog.And(x => taskIds.Contains((int)x.JobID));
if (pageQuery.Query.Status.IsNotEmptyOrNull())
{
whereExpressionLog = whereExpressionLog.And(x => x.Status == pageQuery.Query.Status);
}
if (pageQuery.DateRange.IsNotEmptyOrNull() && pageQuery.DateRange.Count > 0)
{
if (pageQuery.DateRange[0].IsNotEmptyOrNull())
{
whereExpressionLog = whereExpressionLog.And(x => x.RunTimeStart >= pageQuery.DateRange[0]);
}
if (pageQuery.DateRange.Count > 1 && pageQuery.DateRange[1].IsNotEmptyOrNull())
{
whereExpressionLog = whereExpressionLog.And(x => x.RunTimeEnd <= pageQuery.DateRange[1]);
}
}
var orderBy = (pageQuery.OrderBy ?? "ID") + " " + (pageQuery.IsAsc ? "asc" : "desc");
var log = await _sysJobLogService.QueryPageAsync(whereExpressionLog, pageQuery.Page, pageQuery.PageSize, orderBy);
var data = _mapper.Map<PageModel<JobLogView>>(log);
data.data.ForEach(x => x.TasksQz = taskQzs.Find(m => m.ID == x.JobID));
return Success(data);
}
/// <summary>
/// 删除日志
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> jobId)
{
return Success(await _sysJobLogService.DeleteByIdAsync(jobId));
}
/// <summary>
/// 清空日志
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<bool>> Clear()
{
return Success(await _sysJobLogService.Clear());
}
}
}

@ -0,0 +1,187 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysLoginInfoController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysLoginInfoController : BaseApiController
{
/// <summary>
/// _sysLoginInfoService
/// </summary>
private readonly ISysLoginInfoService _sysLoginInfoService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysLoginInfoService"></param>
public SysLoginInfoController(ISysLoginInfoService SysLoginInfoService)
{
_sysLoginInfoService = SysLoginInfoService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysLoginInfo>>> GetByPage([FromBody] PageQuery<SysLoginInfo> pageQuery)
{
Expression<Func<SysLoginInfo, bool>> whereExpression = x => true;
if (pageQuery.Query.IPAddr.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.IPAddr.Contains(pageQuery.Query.IPAddr));
}
if (pageQuery.Query.UserName.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.UserName.Contains(pageQuery.Query.UserName) || x.Msg.Contains(pageQuery.Query.Msg));
}
if (pageQuery.Query.Status.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Status == pageQuery.Query.Status);
}
if (pageQuery.DateRange.IsNotEmptyOrNull() && pageQuery.DateRange.Count > 0)
{
if (pageQuery.DateRange[0].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.LoginTime >= pageQuery.DateRange[0]);
}
if (pageQuery.DateRange.Count > 1 && pageQuery.DateRange[1].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.LoginTime <= pageQuery.DateRange[1]);
}
}
var orderBy = pageQuery.OrderBy + " " + (pageQuery.IsAsc ? "asc" : "desc");
var data = await _sysLoginInfoService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, orderBy);
return Success(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysLoginInfo>> GetByID(int id)
{
return new MessageModel<SysLoginInfo>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysLoginInfoService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysLoginInfo</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysLoginInfo request)
{
var data = new MessageModel<int>();
data.data = await _sysLoginInfoService.AddAsync(request);
if (data.success)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysLoginInfo</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysLoginInfo request)
{
var data = new MessageModel<bool>();
data.success = await _sysLoginInfoService.UpdateAsync(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysLoginInfoService.DeleteByIdAsync(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 导出数据
/// </summary>
/// <param name="loginInfo"></param>
/// <returns></returns>
[HttpPost]
public MessageModel<List<SysLoginInfo>> Export(SysLoginInfo loginInfo)
{
return null;
}
/// <summary>
/// 清空日志
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Clear()
{
return Success(await _sysLoginInfoService.Clear());
}
}
}

@ -0,0 +1,225 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using AutoMapper;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysMenuController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysMenuController : BaseApiUserController
{
/// <summary>
/// _sysMenuService
/// </summary>
private readonly ISysMenuService _sysMenuService;
private readonly IMapper _mapper;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysMenuService"></param>
/// <param name="mapper"></param>
/// <param name="sysUserService"></param>
public SysMenuController(ISysMenuService SysMenuService, IMapper mapper, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysMenuService = SysMenuService;
_mapper = mapper;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<List<MenuView>>> GetByPage([FromBody] PageQuery<SysMenu> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new SysMenu();
}
var model = await _sysMenuService.SelectMenuList(CurrentUser.UserID, pageQuery);
var r = _mapper.Map<List<MenuView>>(model);
return Success(r);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysMenu>> GetByID(int id)
{
return new MessageModel<SysMenu>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysMenuService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysMenu</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysMenu request)
{
var data = new MessageModel<int>();
if (!await _sysMenuService.CheckMenuNameUnique(request))
{
data.success = false;
data.msg = "菜单名称已存在!";
return data;
}
if (SysConst.YES_FRAME == request.IsFrame && !StringHelper.IsUrl(request.Path))
{
data.success = false;
data.msg = "地址必须以http(s)://开头!";
return data;
}
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
data.data = await _sysMenuService.InsertMenu(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysMenu</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysMenu request)
{
var data = new MessageModel<bool>();
if (!await _sysMenuService.CheckMenuNameUnique(request))
{
data.success = false;
data.msg = "菜单名称已存在!";
return data;
}
else if (SysConst.YES_FRAME == request.IsFrame && !StringHelper.IsUrl(request.Path))
{
data.success = false;
data.msg = "地址必须以http(s)://开头!";
return data;
}
else if (request.MenuID == request.ParentID)
{
data.success = false;
data.msg = "上级菜单不能选择自己!";
return data;
}
request.UpdateBy = CurrentUser.LoginName;
request.ParentID = request.ParentID ?? 0;
data.success = await _sysMenuService.UpdateMenu(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(int id)
{
var data = new MessageModel<bool>();
if (await _sysMenuService.HasChildByMenuId(id))
{
data.success = false;
data.msg = "存在子菜单,不允许删除!";
return data;
}
if ((await _sysMenuService.CheckMenuExistRole(id)) > 0)
{
data.success = false;
data.msg = "菜单已分配,不允许删除!";
return data;
}
data.success = await _sysMenuService.DeleteMenuById(id);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 获取菜单下拉树列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<TreeSelect>>> Treeselect()
{
var menus = await _sysMenuService.SelectMenuList(CurrentUser.UserID);
return Success(_sysMenuService.BuildMenuTreeSelect(menus));
}
/// <summary>
/// 加载对应角色菜单列表树
/// </summary>
/// <param name="roleId">角色ID</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<RoleMenuTree>> RoleMenuTreeselect(int roleId)
{
var menus = await _sysMenuService.SelectMenuList(CurrentUser.UserID);
var checkedKeys = await _sysMenuService.SelectMenuListByRoleId(roleId);
var trees = _sysMenuService.BuildMenuTreeSelect(menus);
return Success(new RoleMenuTree
{
CheckedKeys = checkedKeys,
Menus = trees
});
}
}
}

@ -0,0 +1,166 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysNoticeController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysNoticeController : BaseApiUserController
{
/// <summary>
/// _sysNoticeService
/// </summary>
private readonly ISysNoticeService _sysNoticeService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysNoticeService"></param>
/// <param name="sysUserService"></param>
public SysNoticeController(ISysNoticeService SysNoticeService, ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysNoticeService = SysNoticeService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
[Action("通知公告", ActionType.QUERY)]
public async Task<MessageModel<PageModel<SysNotice>>> GetByPage([FromBody] PageQuery<SysNotice> pageQuery)
{
Expression<Func<SysNotice, bool>> whereExpression = x => true;
if (pageQuery.Query.NoticeTitle.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.NoticeTitle.Contains(pageQuery.Query.NoticeTitle));
}
if (pageQuery.Query.NoticeType.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.NoticeType == pageQuery.Query.NoticeType);
}
if (pageQuery.Query.CreateBy.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.CreateBy.Contains(pageQuery.Query.CreateBy));
}
if (pageQuery.Query.Status.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Status == pageQuery.Query.Status);
}
var data = await _sysNoticeService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, "UpdateTime desc");
return Success(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
[Action("通知公告", ActionType.QUERY)]
public async Task<MessageModel<SysNotice>> GetByID(int id)
{
return new MessageModel<SysNotice>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysNoticeService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysNotice</param>
/// <returns></returns>
[HttpPost]
[Action("通知公告", ActionType.ADD)]
public async Task<MessageModel<int>> Add([FromBody] SysNotice request)
{
var data = new MessageModel<int>();
request.CreateBy = CurrentUser.LoginName;
request.UpdateBy = CurrentUser.LoginName;
request.CreateTime = DateTime.Now;
request.UpdateTime = DateTime.Now;
data.data = await _sysNoticeService.AddAsync(request);
if (data.success)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysNotice</param>
/// <returns></returns>
[HttpPost]
[Action("通知公告", ActionType.UPDATE)]
public async Task<MessageModel<bool>> Update([FromBody] SysNotice request)
{
var data = new MessageModel<bool>();
request.UpdateBy = CurrentUser.LoginName;
request.UpdateTime = DateTime.Now;
data.success = await _sysNoticeService.UpdateAsync(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
[Action("通知公告", ActionType.DEL)]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysNoticeService.DeleteByIdAsync(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
}
}

@ -0,0 +1,191 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysOperLogController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysOperLogController : BaseApiController
{
/// <summary>
/// _sysOperLogService
/// </summary>
private readonly ISysOperLogService _sysOperLogService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysOperLogService"></param>
public SysOperLogController(ISysOperLogService SysOperLogService)
{
_sysOperLogService = SysOperLogService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysOperLog>>> GetByPage([FromBody] PageQuery<SysOperLog> pageQuery)
{
Expression<Func<SysOperLog, bool>> whereExpression = x => true;
if (pageQuery.Query.Title.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Title.Contains(pageQuery.Query.Title));
}
if (pageQuery.Query.OperName.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.OperName.Contains(pageQuery.Query.OperName));
}
if (pageQuery.Query.BusinessType.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.BusinessType == pageQuery.Query.BusinessType);
}
if (pageQuery.Query.Status.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Status == pageQuery.Query.Status);
}
if (pageQuery.DateRange.IsNotEmptyOrNull() && pageQuery.DateRange.Count > 0)
{
if (pageQuery.DateRange[0].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.OperTime >= pageQuery.DateRange[0]);
}
if (pageQuery.DateRange.Count > 1 && pageQuery.DateRange[1].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.OperTime <= pageQuery.DateRange[1]);
}
}
var orderBy = (pageQuery.OrderBy ?? "OperTime") + " " + (pageQuery.IsAsc ? "asc" : "desc");
var data = await _sysOperLogService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, orderBy);
return Success(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysOperLog>> GetByID(int id)
{
return new MessageModel<SysOperLog>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysOperLogService.QueryByIdAsync(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysOperLog</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysOperLog request)
{
var data = new MessageModel<int>();
data.data = await _sysOperLogService.AddAsync(request);
if (data.success)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysOperLog</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysOperLog request)
{
var data = new MessageModel<bool>();
data.success = await _sysOperLogService.UpdateAsync(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
data.success = await _sysOperLogService.DeleteByIdAsync(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 导出数据
/// </summary>
/// <param name="operLog"></param>
/// <returns></returns>
[HttpPost]
public MessageModel<List<SysOperLog>> Export(SysOperLog operLog)
{
return null;
}
/// <summary>
/// 清空日志
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Clear()
{
return Success(await _sysOperLogService.Clear());
}
}
}

@ -0,0 +1,195 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysPostController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysPostController : BaseApiController
{
/// <summary>
/// _sysPostService
/// </summary>
private readonly ISysPostService _sysPostService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysPostService"></param>
public SysPostController(ISysPostService SysPostService)
{
_sysPostService = SysPostService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysPost>>> GetByPage([FromBody] PageQuery<SysPost> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new SysPost();
}
var data = await _sysPostService.SelectPostList(pageQuery);
return SuccessPage(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysPost>> GetByID(int id)
{
return new MessageModel<SysPost>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = await _sysPostService.SelectPostById(id)
};
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysPost</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] SysPost request)
{
var data = new MessageModel<int>();
if (!await _sysPostService.CheckPostNameUnique(request))
{
data.success = false;
data.msg = "岗位名称已存在!";
return data;
}
if (!await _sysPostService.CheckPostCodeUnique(request))
{
data.success = false;
data.msg = "岗位编码已存在!";
return data;
}
data.data = await _sysPostService.InsertPost(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysPost</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] SysPost request)
{
var data = new MessageModel<bool>();
if (!await _sysPostService.CheckPostNameUnique(request))
{
data.success = false;
data.msg = "岗位名称已存在!";
return data;
}
if (!await _sysPostService.CheckPostCodeUnique(request))
{
data.success = false;
data.msg = "岗位编码已存在!";
return data;
}
data.success = await _sysPostService.UpdatePost(request);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
if ((await _sysPostService.CountUserPostById(ids)) > 0)
{
data.success = false;
data.msg = "岗位已分配用户,不可删除!";
return data;
}
data.success = await _sysPostService.DeletePostByIds(ids);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 数据导出
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public Task<MessageModel<string>> Export(SysPost post)
{
return null;
}
/// <summary>
/// 获取岗位选择框列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<SysPost>>> Optionselect()
{
return Success(await _sysPostService.SelectPostAll());
}
}
}

@ -0,0 +1,357 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysRoleController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysRoleController : BaseApiUserController
{
/// <summary>
/// _sysRoleService
/// </summary>
private readonly ISysRoleService _sysRoleService;
private readonly ISysRoleMenuService _sysRoleMenuService;
private readonly ISysRoleDeptService _sysRoleDeptService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysRoleService"></param>
/// <param name="sysRoleMenuService"></param>
/// <param name="sysRoleDeptService"></param>
/// <param name="sysUserService"></param>
public SysRoleController(ISysRoleService SysRoleService, ISysRoleMenuService sysRoleMenuService, ISysRoleDeptService sysRoleDeptService,
ISysUserService sysUserService) : base(sysUserService)
{
_sysRoleService = SysRoleService;
_sysUserService = sysUserService;
_sysRoleMenuService = sysRoleMenuService;
_sysRoleDeptService = sysRoleDeptService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysRole>>> GetByPage([FromBody] PageQuery<RoleQuery> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new RoleQuery();
}
var userModel = await _sysRoleService.SelectRoleList(pageQuery);
return SuccessPage(userModel);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<RoleView>> GetByID(int id)
{
return Success(await _sysRoleService.GetInfo(id));
}
/// <summary>
/// 根据编号获取详细信息
/// </summary>
/// <param name="roleId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<RoleView>> GetInfo(int roleId)
{
return Success(await _sysRoleService.GetInfo(roleId));
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">RoleView</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] RoleView request)
{
MessageModel<int> data = new MessageModel<int>();
var exist = await _sysRoleService.CheckRoleNameUnique(request.SysRole.RoleName);
if (exist)
{
data.success = false;
data.msg = "角色名称已存在!";
return data;
}
exist = await _sysRoleService.CheckRoleKeyUnique(request.SysRole.RoleKey);
if (exist)
{
data.success = false;
data.msg = "角色Key已存在";
return data;
}
request.SysRole.CreateBy = CurrentUser.LoginName;
request.SysRole.UpdateBy = CurrentUser.LoginName;
data.data = await _sysRoleService.InsertRole(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">RoleView</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] RoleView request)
{
var data = new MessageModel<bool>();
if (RoleView.IsAdmin(request.SysRole.RoleID))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
request.SysRole.UpdateBy = CurrentUser.LoginName;
data.data = await _sysRoleService.UpdateRole(request);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
foreach (var item in ids)
{
if (RoleView.IsAdmin(item))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
}
data.data = await _sysRoleService.DeleteRoleByIds(ids.ToArray(), CurrentUser.LoginName);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 修改保存数据权限
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> DataScope(RoleView role)
{
var data = new MessageModel<bool>();
if (RoleView.IsAdmin(role.SysRole.RoleID))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
data.data = await _sysRoleService.AuthDataScope(role);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 修改状态
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> ChangeStatus(SysRole role)
{
var data = new MessageModel<bool>();
if (RoleView.IsAdmin(role.RoleID))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
var updateBy = CurrentUser.LoginName;
data.data = await _sysRoleService.UpdateRoleStatus(role, updateBy);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 数据导出
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Export(SysRole role)
{
Expression<Func<SysRole, bool>> whereExpression = a => true;
var list = await _sysRoleService.QueryAsync(whereExpression);
return Success<string>(ExcelHelper.ExportToList(list, "角色数据"));
}
/// <summary>
/// 获取角色选择框列表
/// </summary>
[HttpGet]
public async Task<MessageModel<List<SysRole>>> Optionselect()
{
return Success(await _sysRoleService.QueryAsync());
}
/// <summary>
/// 取消授权用户
/// </summary>
/// <param name="userRole"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> CancelAuthUser(SysUserRole userRole)
{
var data = new MessageModel<bool>();
data.data = await _sysRoleService.DeleteAuthUser(userRole);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 批量取消授权用户
/// </summary>
/// <param name="userRoleView"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> CancelAuthUserAll(UserRoleView userRoleView)
{
var data = new MessageModel<bool>();
data.data = await _sysRoleService.DeleteAuthUsers(userRoleView.RoleID, userRoleView.UserIds.ToArray());
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 批量选择用户授权
/// </summary>
/// <param name="userRoleView"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> SelectAuthUserAll(UserRoleView userRoleView)
{
var data = new MessageModel<bool>();
data.data = await _sysRoleService.InsertAuthUsers(userRoleView.RoleID, userRoleView.UserIds.ToArray());
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
}
}

@ -0,0 +1,76 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysRoleDeptController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysRoleDeptController : BaseApiController
{
/// <summary>
/// _sysRoleDeptService
/// </summary>
private readonly ISysRoleDeptService _sysRoleDeptService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysRoleDeptService"></param>
public SysRoleDeptController(ISysRoleDeptService SysRoleDeptService)
{
_sysRoleDeptService = SysRoleDeptService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="page">第几页</param>
/// <param name="key"></param>
/// <param name="intPageSize">每页大小</param>
/// <returns></returns>
[HttpGet]
public MessageModel<PageModel<SysRoleDept>> GetByPage(int page = 1, string key = "", int intPageSize = 50)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
Expression<Func<SysRoleDept, bool>> whereExpression = a => true;
var data = _sysRoleDeptService.QueryPageAsync(whereExpression, page, intPageSize, "UpdateTime").Result;
return SuccessPage(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public MessageModel<SysRoleDept> GetByID(int id)
{
return new MessageModel<SysRoleDept>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = _sysRoleDeptService.QueryByIdAsync(id).Result
};
}
}
}

@ -0,0 +1,76 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysRoleMenuController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysRoleMenuController : BaseApiController
{
/// <summary>
/// _sysRoleMenuService
/// </summary>
private readonly ISysRoleMenuService _sysRoleMenuService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysRoleMenuService"></param>
public SysRoleMenuController(ISysRoleMenuService SysRoleMenuService)
{
_sysRoleMenuService = SysRoleMenuService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="page">第几页</param>
/// <param name="key"></param>
/// <param name="intPageSize">每页大小</param>
/// <returns></returns>
[HttpGet]
public MessageModel<PageModel<SysRoleMenu>> GetByPage(int page = 1, string key = "", int intPageSize = 50)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
Expression<Func<SysRoleMenu, bool>> whereExpression = a => true;
var data = _sysRoleMenuService.QueryPageAsync(whereExpression, page, intPageSize, "UpdateTime").Result;
return SuccessPage(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public MessageModel<SysRoleMenu> GetByID(int id)
{
return new MessageModel<SysRoleMenu>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = _sysRoleMenuService.QueryByIdAsync(id).Result
};
}
}
}

@ -0,0 +1,599 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.Common.Resource;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Model.Sys;
using Admin.Core.Repository;
using Admin.Core.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Quartz;
namespace Admin.Core.Api
{
/// <summary>
/// 任务调度
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysTasksQzController : BaseApiUserController
{
private readonly ISysTasksQzService _tasksQzService;
private readonly ISchedulerCenter _schedulerCenter;
private readonly IUnitOfWork _unitOfWork;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="tasksQzService"></param>
/// <param name="schedulerCenter"></param>
/// <param name="unitOfWork"></param>
/// <param name="sysUserService"></param>
public SysTasksQzController(ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter, IUnitOfWork unitOfWork,
ISysUserService sysUserService) : base(sysUserService)
{
_sysUserService = sysUserService;
_unitOfWork = unitOfWork;
_tasksQzService = tasksQzService;
_schedulerCenter = schedulerCenter;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<SysTasksQz>>> GetByPage([FromBody] PageQuery<SysTasksQz> pageQuery)
{
Expression<Func<SysTasksQz, bool>> whereExpression = x => x.DelFlag == false;
if (pageQuery.Query.Name.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.Name.Contains(pageQuery.Query.Name));
}
if (pageQuery.Query.JobGroup.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.JobGroup == pageQuery.Query.JobGroup);
}
if (pageQuery.Query.IsStart.IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.IsStart == pageQuery.Query.IsStart);
}
if (pageQuery.DateRange.IsNotEmptyOrNull() && pageQuery.DateRange.Count > 0)
{
if (pageQuery.DateRange[0].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.BeginTime >= pageQuery.DateRange[0]);
}
if (pageQuery.DateRange.Count > 1 && pageQuery.DateRange[1].IsNotEmptyOrNull())
{
whereExpression = whereExpression.And(x => x.EndTime <= pageQuery.DateRange[1]);
}
}
var orderBy = (pageQuery.OrderBy ?? "UpdateTime") + " " + (pageQuery.IsAsc ? "asc" : "desc");
var data = await _tasksQzService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, orderBy);
if (data.dataCount > 0)
{
foreach (var item in data.data)
{
item.Triggers = await _schedulerCenter.GetTaskStaus(item);
}
}
return Success(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<SysTasksQz>> GetByID(int id)
{
var data = await _tasksQzService.QueryByIdAsync(id);
data.Triggers = await _schedulerCenter.GetTaskStaus(data);
return new MessageModel<SysTasksQz>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = data
};
}
/// <summary>
/// 添加计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Add([FromBody] SysTasksQz tasksQz)
{
var data = new MessageModel<string>();
_unitOfWork.BeginTran();
tasksQz.CreateTime = DateTime.Now;
tasksQz.UpdateTime = DateTime.Now;
tasksQz.CreateBy = CurrentUser.LoginName;
tasksQz.UpdateBy = CurrentUser.LoginName;
tasksQz.RunTimes = 0;
tasksQz.DelFlag = false;
var id = await _tasksQzService.AddAsync(tasksQz);
data.success = id > 0;
try
{
if (data.success)
{
tasksQz.ID = id;
data.data = id.ObjToString();
data.msg = "添加成功";
if ((bool)tasksQz.IsStart)
{
//如果是启动自动
var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(tasksQz);
data.success = ResuleModel.success;
if (ResuleModel.success)
{
data.msg = $"{data.msg}=>启动成功=>{ResuleModel.msg}";
}
else
{
data.msg = $"{data.msg}=>启动失败=>{ResuleModel.msg}";
}
}
}
else
{
data.msg = "添加失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
return data;
}
/// <summary>
/// 修改计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Update([FromBody] SysTasksQz tasksQz)
{
var data = new MessageModel<string>();
if (tasksQz != null && tasksQz.ID > 0)
{
_unitOfWork.BeginTran();
tasksQz.UpdateBy = CurrentUser.LoginName;
tasksQz.UpdateTime = DateTime.Now;
data.success = await _tasksQzService.UpdateAsync(tasksQz);
try
{
if (data.success)
{
data.msg = "修改成功";
data.data = tasksQz?.ID.ObjToString();
if ((bool)tasksQz.IsStart)
{
var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz);
data.msg = $"{data.msg}=>停止:{ResuleModelStop.msg}";
var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(tasksQz);
data.success = ResuleModelStar.success;
data.msg = $"{data.msg}=>启动:{ResuleModelStar.msg}";
}
else
{
var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz);
data.msg = $"{data.msg}=>停止:{ResuleModelStop.msg}";
}
}
else
{
data.msg = "修改失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
return data;
}
/// <summary>
/// 删除一个任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> Del(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
_unitOfWork.BeginTran();
data.success = await _tasksQzService.DeleteAsync(model);
try
{
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "删除成功";
var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model);
data.msg = $"{data.msg}=>任务状态=>{ResuleModel.msg}";
}
else
{
data.msg = "删除失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 启动计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> StartJob(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
_unitOfWork.BeginTran();
try
{
model.UpdateBy = CurrentUser.LoginName;
model.UpdateTime = DateTime.Now;
model.IsStart = true;
data.success = await _tasksQzService.UpdateAsync(model);
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "更新成功";
var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(model);
data.success = ResuleModel.success;
if (ResuleModel.success)
{
data.msg = $"{data.msg}=>启动成功=>{ResuleModel.msg}";
}
else
{
data.msg = $"{data.msg}=>启动失败=>{ResuleModel.msg}";
}
}
else
{
data.msg = "更新失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 停止一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> StopJob(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
model.UpdateBy = CurrentUser.LoginName;
model.UpdateTime = DateTime.Now;
model.IsStart = false;
data.success = await _tasksQzService.UpdateAsync(model);
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "更新成功";
var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model);
if (ResuleModel.success)
{
data.msg = $"{data.msg}=>停止成功=>{ResuleModel.msg}";
}
else
{
data.msg = $"{data.msg}=>停止失败=>{ResuleModel.msg}";
}
}
else
{
data.msg = "更新失败";
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 暂停一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> PauseJob(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
_unitOfWork.BeginTran();
try
{
data.success = await _tasksQzService.UpdateAsync(model);
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "更新成功";
var ResuleModel = await _schedulerCenter.PauseJob(model);
if (ResuleModel.success)
{
data.msg = $"{data.msg}=>暂停成功=>{ResuleModel.msg}";
}
else
{
data.msg = $"{data.msg}=>暂停失败=>{ResuleModel.msg}";
}
data.success = ResuleModel.success;
}
else
{
data.msg = "更新失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 恢复一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> ResumeJob(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
_unitOfWork.BeginTran();
try
{
model.IsStart = true;
data.success = await _tasksQzService.UpdateAsync(model);
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "更新成功";
var ResuleModel = await _schedulerCenter.ResumeJob(model);
if (ResuleModel.success)
{
data.msg = $"{data.msg}=>恢复成功=>{ResuleModel.msg}";
}
else
{
data.msg = $"{data.msg}=>恢复失败=>{ResuleModel.msg}";
}
data.success = ResuleModel.success;
}
else
{
data.msg = "更新失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 重启一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> ReCovery(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
_unitOfWork.BeginTran();
try
{
model.UpdateBy = CurrentUser.LoginName;
model.UpdateTime = DateTime.Now;
model.IsStart = true;
data.success = await _tasksQzService.UpdateAsync(model);
data.data = jobId.ObjToString();
if (data.success)
{
data.msg = "更新成功";
var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(model);
var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(model);
if (ResuleModelStar.success)
{
data.msg = $"{data.msg}=>停止:{ResuleModelStop.msg}=>启动:{ResuleModelStar.msg}";
data.data = jobId.ObjToString();
}
else
{
data.msg = $"{data.msg}=>停止:{ResuleModelStop.msg}=>启动:{ResuleModelStar.msg}";
data.data = jobId.ObjToString();
}
data.success = ResuleModelStar.success;
}
else
{
data.msg = "更新失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.success)
_unitOfWork.CommitTran();
else
_unitOfWork.RollbackTran();
}
}
else
{
data.msg = "任务不存在";
}
return data;
}
/// <summary>
/// 获取任务命名空间
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<List<QuartzReflectionView>> GetTaskNameSpace()
{
var baseType = typeof(IJob);
var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
var referencedAssemblies = System.IO.Directory.GetFiles(path, "Admin.Core.Tasks.dll").Select(Assembly.LoadFrom).ToArray();
var types = referencedAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
var implementTypes = types.Where(x => x.IsClass).Select(item => new QuartzReflectionView { nameSpace = item.Namespace, nameClass = item.Name, remark = "" }).ToList();
return MessageModel<List<QuartzReflectionView>>.Success("获取成功", implementTypes);
}
/// <summary>
/// 立即执行任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<string>> ExecuteJob(int jobId)
{
var data = new MessageModel<string>();
var model = await _tasksQzService.QueryByIdAsync(jobId);
if (model != null)
{
return await _schedulerCenter.ExecuteJobAsync(model);
}
else
{
data.success = false;
data.msg = "任务不存在";
}
return data;
}
}
}

@ -0,0 +1,420 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using System.IO;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysUserController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysUserController : BaseApiUserController
{
/// <summary>
/// _sysUserService
/// </summary>
private readonly ISysUserRoleService _sysUserRoleService;
private readonly ISysRoleService _sysRoleService;
private readonly ISysPostService _sysPostService;
private readonly ISysUserPostService _sysUserPostService;
private readonly ISysDeptService _sysDeptService;
private readonly IMapper _mapper;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="sysUserService"></param>
/// <param name="sysUserRoleService"></param>
/// <param name="sysRoleService"></param>
/// <param name="sysPostService"></param>
/// <param name="sysUserPostService"></param>
/// <param name="sysDeptService"></param>
/// <param name="mapper"></param>
public SysUserController(ISysUserService sysUserService, ISysUserRoleService sysUserRoleService, ISysRoleService sysRoleService, ISysPostService sysPostService,
ISysUserPostService sysUserPostService, ISysDeptService sysDeptService, IMapper mapper) : base(sysUserService)
{
_sysUserService = sysUserService;
_sysUserRoleService = sysUserRoleService;
_sysRoleService = sysRoleService;
_sysPostService = sysPostService;
_sysUserPostService = sysUserPostService;
_sysDeptService = sysDeptService;
_mapper = mapper;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<PageModel<UserModel>>> GetByPage([FromBody] PageQuery<UserQuery> pageQuery)
{
if (!pageQuery.Query.IsNotEmptyOrNull())
{
pageQuery.Query = new UserQuery();
}
var model = await _sysUserService.SelectUserList(pageQuery);
return SuccessPage(model);
}
/// <summary>
/// 获取所有用户
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<SysUser>>> GetAllUser(string roleKey = "")
{
return Success(await _sysUserRoleService.GetAllUser(roleKey));
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<UserView>> GetByID(int id)
{
return Success(await _sysUserService.GetByID(id));
}
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="request">SysUser</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<int>> Add([FromBody] UserView request)
{
MessageModel<int> data = new MessageModel<int>();
var exist = await _sysUserService.CheckLoginNameUnique(request.SysUser.LoginName);
if (exist)
{
data.success = false;
data.msg = "账号已存在!";
return data;
}
request.SysUser.CreateBy = CurrentUser.LoginName;
request.SysUser.UpdateBy = CurrentUser.LoginName;
data.data = await _sysUserService.InsertUser(request);
if (data.data > 0)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 更新一条数据
/// </summary>
/// <param name="request">SysUser</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Update([FromBody] UserView request)
{
var data = new MessageModel<bool>();
if (UserView.IsAdmin(request.SysUser.UserID))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
request.SysUser.UpdateBy = CurrentUser.LoginName;
data.data = await _sysUserService.UpdateUser(request);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="ids">主键</param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> Del(List<int> ids)
{
var data = new MessageModel<bool>();
foreach (var userId in ids)
{
if (UserView.IsAdmin(userId))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
}
data.data = await _sysUserService.DeleteUserByIds(ids.ToArray(), CurrentUser.LoginName);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 修改用户状态
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> ChangeStatus(SysUser user)
{
var data = new MessageModel<bool>();
if (UserView.IsAdmin(user.UserID))
{
data.success = false;
data.msg = Resource_SysBase.OprateAdmin;
return data;
}
user.UpdateBy = CurrentUser.LoginName;
data.data = await _sysUserService.UpdateUserStatus(user);
if (data.data)
{
data.success = true;
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.success = false;
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 用户数据导出
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Export(SysUser user)
{
Expression<Func<SysUser, bool>> whereExpression = a => true;
var list = await _sysUserService.QueryAsync(whereExpression);
return Success<string>(ExcelHelper.ExportToList(list, "用户数据"));
}
/// <summary>
/// 用户数据导入
/// </summary>
/// <param name="file"></param>
/// <param name="updateSupport"></param>
/// <returns></returns>
[HttpPost]
public MessageModel<bool> ImportData(string file, bool updateSupport)
{
return Success(true);
}
/// <summary>
/// 用户数据导入模板
/// </summary>
/// <returns></returns>
[HttpGet]
public MessageModel<string> ImportTemplate()
{
return Success<string>(string.Empty);
}
/// <summary>
/// 根据用户编号获取详细信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<UserView>> GetInfo(int userId)
{
return Success(await _sysUserService.GetInfo(userId));
}
/// <summary>
/// 重置密码
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> ResetPwd(SysUser user)
{
var data = new MessageModel<string>();
user.UpdateBy = CurrentUser.LoginName;
data.success = await _sysUserService.ResetPwd(user);
if (data.success)
{
data.msg = Resource_SysBase.OprateSuccess;
}
else
{
data.msg = Resource_SysBase.OprateFail;
}
return data;
}
/// <summary>
/// 根据用户编号获取授权角色
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<UserView>> AuthRole(int userId)
{
return Success(await _sysUserService.AuthRole(userId));
}
/// <summary>
/// 查询用户已分配角色列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<UserView>> AllocatedList(int userId)
{
return Success(await _sysUserService.AllocatedList(userId));
}
/// <summary>
/// 查询用户未分配角色列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<UserView>> UnallocatedList(int userId)
{
return Success(await _sysUserService.UnallocatedList(userId));
}
/// <summary>
/// 用户授权角色
/// </summary>
/// <param name="view"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<bool>> InsertAuthRole(UserRoleView view)
{
return Success(await _sysUserService.InsertUserAuth(view.UserID, view.RoleIds.ToArray()));
}
/// <summary>
/// 个人信息
/// </summary>
[HttpGet]
public async Task<MessageModel<UserView>> Profile()
{
return Success(await _sysUserService.GetInfo(CurrentUser.UserID));
}
/// <summary>
/// 修改用户基础信息
/// </summary>
[HttpPost]
public async Task<MessageModel<bool>> UpdateProfile(SysUser user)
{
user.UpdateBy = CurrentUser.LoginName;
return Success(await _sysUserService.UpdateUserProfile(user));
}
/// <summary>
/// 重置密码
/// </summary>
[HttpPost]
public async Task<MessageModel<bool>> UpdatePwd(string oldPassword, string newPassword)
{
MessageModel<bool> model = new MessageModel<bool>();
var user = await _sysUserService.QueryByIdAsync(CurrentUser.UserID);
if (MD5Helper.MD5Encrypt32(oldPassword) == user.Password)
{
user.Password = MD5Helper.MD5Encrypt32(newPassword);
user.UpdateBy = CurrentUser.LoginName;
user.UpdateTime = DateTime.Now;
model.success = await _sysUserService.UpdateAsync(user);
}
else
{
model.success = false;
model.msg = Resource_SysBase.OprateFail;
}
return model;
}
/// <summary>
/// 头像上传
/// </summary>
[HttpPost]
public async Task<MessageModel<string>> Avatar()
{
MessageModel<string> model = new MessageModel<string>();
//获取Form提交的文件
var files = Request.Form.Files;
if (files.Count == 0)
{
model.success = false;
model.msg = "文件不存在!";
return model;
}
model = await FileHelper.FileSaveByBlob(files);
if (model.success)
{
var user = await _sysUserService.QueryByIdAsync(CurrentUser.UserID);
user.Avatar = model.data;
user.UpdateBy = CurrentUser.LoginName;
user.UpdateTime = DateTime.Now;
await _sysUserService.UpdateAsync(user);
}
return model;
}
}
}

@ -0,0 +1,76 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysUserPostController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysUserPostController : BaseApiController
{
/// <summary>
/// _sysUserPostService
/// </summary>
private readonly ISysUserPostService _sysUserPostService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysUserPostService"></param>
public SysUserPostController(ISysUserPostService SysUserPostService)
{
_sysUserPostService = SysUserPostService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="page">第几页</param>
/// <param name="key"></param>
/// <param name="intPageSize">每页大小</param>
/// <returns></returns>
[HttpGet]
public MessageModel<PageModel<SysUserPost>> GetByPage(int page = 1, string key = "", int intPageSize = 50)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
Expression<Func<SysUserPost, bool>> whereExpression = a => true;
var data = _sysUserPostService.QueryPageAsync(whereExpression, page, intPageSize, "UpdateTime").Result;
return SuccessPage(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public MessageModel<SysUserPost> GetByID(int id)
{
return new MessageModel<SysUserPost>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = _sysUserPostService.QueryByIdAsync(id).Result
};
}
}
}

@ -0,0 +1,76 @@
using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;
namespace Admin.Core.Api
{
/// <summary>
/// SysUserRoleController
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class SysUserRoleController : BaseApiController
{
/// <summary>
/// _sysUserRoleService
/// </summary>
private readonly ISysUserRoleService _sysUserRoleService;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="SysUserRoleService"></param>
public SysUserRoleController(ISysUserRoleService SysUserRoleService)
{
_sysUserRoleService = SysUserRoleService;
}
/// <summary>
/// 分页查询
/// </summary>
/// <param name="page">第几页</param>
/// <param name="key"></param>
/// <param name="intPageSize">每页大小</param>
/// <returns></returns>
[HttpGet]
public MessageModel<PageModel<SysUserRole>> GetByPage(int page = 1, string key = "", int intPageSize = 50)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
Expression<Func<SysUserRole, bool>> whereExpression = a => true;
var data = _sysUserRoleService.QueryPageAsync(whereExpression, page, intPageSize, "UpdateTime").Result;
return SuccessPage(data);
}
/// <summary>
/// 根据ID查询
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
[HttpGet]
public MessageModel<SysUserRole> GetByID(int id)
{
return new MessageModel<SysUserRole>()
{
msg = Resource_SysBase.OprateSuccess,
success = true,
data = _sysUserRoleService.QueryByIdAsync(id).Result
};
}
}
}

@ -0,0 +1,24 @@
using Autofac;
using Microsoft.AspNetCore.Mvc;
namespace Admin.Core.Api
{
/// <summary>
/// AutofacPropertityModuleReg
/// </summary>
public class AutofacPropertityModuleReg : Autofac.Module
{
/// <summary>
/// Load
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired();
}
}
}

@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using System;
using static Admin.Core.Extensions.CustomApiVersion;
namespace Admin.Core.Api
{
/// <summary>
/// 自定义路由 /api/{version}/[controler]/[action]
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
{
/// <summary>
/// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider
/// </summary>
public string GroupName { get; set; }
/// <summary>
/// 自定义路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
public CustomRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName)
{
}
/// <summary>
/// 自定义版本+路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
/// <param name="version"></param>
public CustomRouteAttribute(ApiVersions version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}")
{
GroupName = version.ToString();
}
}
}

@ -0,0 +1,65 @@
using Admin.Core.Common;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Linq;
using System.Threading.Tasks;
namespace Admin.Core.Api
{
/// <summary>
/// Summary:全局路由权限公约
/// Remarks:目的是针对不同的路由,采用不同的授权过滤器
/// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
/// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize]然后再action上自定义授权即可比如 [Authorize(Roles = "Admin")]
/// </summary>
public class GlobalRouteAuthorizeConvention : IApplicationModelConvention
{
/// <summary>
/// Apply
/// </summary>
/// <param name="application"></param>
public void Apply(ApplicationModel application)
{
foreach (var c in application.Controllers)
{
if (!c.Filters.Any(e => e is AuthorizeFilter))
{
// 没有写特性,就用全局的 Permission 授权
c.Filters.Add(new AuthorizeFilter(Permissions.Name));
}
else {
// 写了特性,[Authorize] 或 [AllowAnonymous] ,根据情况进行权限认证
}
}
}
}
/// <summary>
/// 全局权限过滤器【无效】
/// </summary>
public class GlobalAuthorizeFilter : AuthorizeFilter
{
/// <summary>
/// OnAuthorizationAsync
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this))
{
return Task.FromResult(0);
}
return base.OnAuthorizationAsync(context);
}
}
}

@ -0,0 +1,110 @@
using Admin.Core.Common;
using Admin.Core.Model;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using StackExchange.Profiling;
using System;
namespace Admin.Core.Api
{
/// <summary>
/// 全局异常错误日志
/// </summary>
public class GlobalExceptionsFilter : IExceptionFilter
{
private readonly IWebHostEnvironment _env;
//private readonly IHubContext<ChatHub> _hubContext;
private readonly ILogger<GlobalExceptionsFilter> _loggerHelper;
/// <summary>
/// 构造
/// </summary>
/// <param name="env"></param>
/// <param name="loggerHelper"></param>
public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger<GlobalExceptionsFilter> loggerHelper)
{
_env = env;
_loggerHelper = loggerHelper;
}
/// <summary>
/// OnException
/// </summary>
/// <param name="context"></param>
public void OnException(ExceptionContext context)
{
var json = new MessageModel<string>();
json.msg = context.Exception.Message;//错误信息
json.status = 500;//500异常
var errorAudit = "Unable to resolve service for";
if (!string.IsNullOrEmpty(json.msg) && json.msg.Contains(errorAudit))
{
json.msg = json.msg.Replace(errorAudit, $"(若新添加服务,需要重新编译项目){errorAudit}");
}
if (_env.EnvironmentName.ObjToString().Equals("Development"))
{
json.msgDev = context.Exception.StackTrace;//堆栈信息
}
var res = new ContentResult();
res.Content = JsonHelper.GetJSON<MessageModel<string>>(json);
context.Result = res;
MiniProfiler.Current.CustomTiming("Errors", json.msg);
//采用log4net 进行错误日志记录
_loggerHelper.LogError(json.msg + WriteLog(json.msg, context.Exception));
}
/// <summary>
/// 自定义返回格式
/// </summary>
/// <param name="throwMsg"></param>
/// <param name="ex"></param>
/// <returns></returns>
public string WriteLog(string throwMsg, Exception ex)
{
return string.Format("\r\n【自定义错误】{0} \r\n【异常类型】{1} \r\n【异常信息】{2} \r\n【堆栈调用】{3}", new object[] { throwMsg,
ex.GetType().Name, ex.Message, ex.StackTrace });
}
}
/// <summary>
/// InternalServerErrorObjectResult
/// </summary>
public class InternalServerErrorObjectResult : ObjectResult
{
/// <summary>
/// InternalServerErrorObjectResult
/// </summary>
/// <param name="value"></param>
public InternalServerErrorObjectResult(object value) : base(value)
{
StatusCode = StatusCodes.Status500InternalServerError;
}
}
/// <summary>
/// 返回错误信息
/// </summary>
public class JsonErrorResponse
{
/// <summary>
/// 生产环境的消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 开发环境的消息
/// </summary>
public string DevelopmentMessage { get; set; }
}
}

@ -0,0 +1,58 @@
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Routing;
using System.Linq;
namespace Admin.Core.Api
{
/// <summary>
/// 全局路由前缀公约
/// </summary>
public class GlobalRoutePrefixFilter : IApplicationModelConvention
{
private readonly AttributeRouteModel _centralPrefix;
/// <summary>
/// GlobalRoutePrefixFilter
/// </summary>
/// <param name="routeTemplateProvider"></param>
public GlobalRoutePrefixFilter(IRouteTemplateProvider routeTemplateProvider)
{
_centralPrefix = new AttributeRouteModel(routeTemplateProvider);
}
/// <summary>
/// 接口的Apply方法
/// </summary>
/// <param name="application"></param>
public void Apply(ApplicationModel application)
{
//遍历所有的 Controller
foreach (var controller in application.Controllers)
{
// 已经标记了 RouteAttribute 的 Controller
var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
if (matchedSelectors.Any())
{
foreach (var selectorModel in matchedSelectors)
{
// 在 当前路由上 再 添加一个 路由前缀
selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,
selectorModel.AttributeRouteModel);
}
}
// 没有标记 RouteAttribute 的 Controller
var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();
if (unmatchedSelectors.Any())
{
foreach (var selectorModel in unmatchedSelectors)
{
// 添加一个 路由前缀
selectorModel.AttributeRouteModel = _centralPrefix;
}
}
}
}
}
}

@ -0,0 +1,49 @@
using Admin.Core.IService;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace Admin.Core.Api
{
/// <summary>
/// UseServiceDIAttribute
/// </summary>
public class UseServiceDIAttribute : ActionFilterAttribute
{
/// <summary>
/// ILogger
/// </summary>
protected readonly ILogger<UseServiceDIAttribute> _logger;
private readonly string _name;
/// <summary>
/// UseServiceDIAttribute
/// </summary>
/// <param name="logger"></param>
/// <param name="Name"></param>
public UseServiceDIAttribute(ILogger<UseServiceDIAttribute> logger, string Name = "")
{
_logger = logger;
_name = Name;
}
/// <summary>
/// OnActionExecuted
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuted(ActionExecutedContext context)
{
//var dd =await _AdminArticleServices.Query();
base.OnActionExecuted(context);
DeleteSubscriptionFiles();
}
/// <summary>
/// DeleteSubscriptionFiles
/// </summary>
private void DeleteSubscriptionFiles()
{
}
}
}

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- 将日志以回滚文件的形式写到文件中 -->
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
<!--Error-->
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
<!--不加utf-8编码格式中文字符将显示成乱码-->
<param name="Encoding" value="utf-8" />
<file value="E:\log\"/>
<appendToFile value="true" />
<rollingStyle value="Date" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value="&quot;GlobalExceptionLogs_&quot;yyyyMMdd&quot;.log&quot;" />
<!--日志文件名是否为静态-->
<StaticLogFileName value="false"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--布局(向用户显示最后经过格式化的输出信息)-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date| %-5level %newline%message%newline--------------------------------%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<!--Error-->
<!--Info-->
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
<!--不加utf-8编码格式中文字符将显示成乱码-->
<param name="Encoding" value="utf-8" />
<!--定义文件存放位置-->
<file value="../../../Log/"/>
<appendToFile value="true" />
<rollingStyle value="Date" />
<!--日志文件名是否为静态-->
<StaticLogFileName value="false"/>
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value="&quot;GlobalInfoLogs_&quot;yyyyMMdd&quot;.log&quot;" />
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--布局(向用户显示最后经过格式化的输出信息)-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="WARN" />
</filter>
</appender>
<!--Info-->
<root>
<!-- 控制级别由低到高ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
<!-- 比如定义级别为INFO则INFO级别向下的级别比如DEBUG日志将不会被记录 -->
<!-- 如果没有定义LEVEL的值则缺省为DEBUG -->
<level value="ALL" />
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
<appender-ref ref="ErrorLog" />
<appender-ref ref="InfoLog" />
</root>
</log4net>

@ -0,0 +1,62 @@
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace Admin.Core.Api
{
/// <summary>
/// Program
/// </summary>
public class Program
{
/// <summary>
/// Main
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
CreateHostBuilder(args)
// 生成承载 web 应用程序的 Microsoft.AspNetCore.Hosting.IWebHost。Build是WebHostBuilder最终的目的将返回一个构造的WebHost最终生成宿主。
.Build()
// 运行 web 应用程序并阻止调用线程, 直到主机关闭。
// ※※※※ 有异常,查看 Log 文件夹下的异常日志 ※※※※
.Run();
}
/// <summary>
/// CreateHostBuilder
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IHostBuilder CreateHostBuilder(string[] args) =>
//初始化默认主机Builder
Host.CreateDefaultBuilder(args)
//Autofac服务工厂
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseIIS().UseStartup<Startup>();
})
.ConfigureLogging((hostingContext, builder) =>
{
// 1.过滤掉系统默认的一些日志
builder.AddFilter("System", LogLevel.Error);
builder.AddFilter("Microsoft", LogLevel.Error);
// 2.也可以在appsettings.json中配置LogLevel节点
// 3.统一设置
builder.SetMinimumLevel(LogLevel.Error);
// 默认log4net.confg
builder.AddLog4Net(Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config"));
});
}
}

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>E:\发布文件</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net6.0</TargetFramework>
<ProjectGuid>4d119349-9b79-489b-8e25-0f314b0693ba</ProjectGuid>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
</Project>

@ -0,0 +1,30 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:55014",
"sslPort": 0
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Admin.Core.Api": {
"commandName": "Project",
"launchBrowser": true,
//"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": "true",
"applicationUrl": "http://localhost:5001;http://localhost:5000"
}
}
}

@ -0,0 +1,268 @@
using Admin.Core.Common;
using Admin.Core.Extensions;
using Admin.Core.IService.ISys;
using Admin.Core.Plc;
using Admin.Core.RunPlc;
using Admin.Core.Tasks;
using Autofac;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Admin.Core.Api
{
/// <summary>
/// Startup
/// </summary>
public class Startup
{
/// <summary>
/// Startup
/// </summary>
/// <param name="configuration"></param>
/// <param name="env"></param>
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Configuration = configuration;
Env = env;
}
/// <summary>
/// IConfiguration
/// </summary>
public IConfiguration Configuration { get; }
/// <summary>
/// 环境信息:开发/生产
/// </summary>
public IWebHostEnvironment Env { get; }
/// <summary>
/// This method gets called by the runtime. Use this method to add services to the container.
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
//Appsettings
services.AddSingleton(new Appsettings(Configuration));
//日志文件目录
services.AddSingleton(new LogLock(Env.ContentRootPath));
//jwt或Ids4权限方案
Permissions.IsUseIds4 = Appsettings.app(new string[] { "Startup", "IdentityServer4", "Enabled" }).ObjToBool();
// 确保从认证中心返回的ClaimType不被更改不使用Map映射
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
//Memory缓存
services.AddMemoryCacheSetup();
//Swagger
services.AddSwaggerSetup();
//Sqlsugar数据库模型查询
services.AddSqlsugarSetup();
//AutoMapper
services.AddAutoMapperSetup();
//跨域
services.AddCorsSetup();
//性能分析
//services.AddMiniProfilerSetup();
//HttpContext上下文
services.AddHttpContextSetup();
// 授权+认证 (jwt or ids4)
services.AddAuthorizationSetup();
if (Permissions.IsUseIds4) { services.AddAuthentication_Ids4Setup(); }
else { services.AddAuthentication_JWTSetup(); }
//IPLimit限流
services.AddIpPolicyRateLimitSetup(Configuration);
//筛选器
//services.AddScoped<UseServiceDIAttribute>();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
// Default is true, make it false
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
//任务调度
services.AddJobSetup();
//添加PLC
services.AddPlcSetup();
//Redis缓存
//services.AddRedisCacheSetup();
//Redis队列
//services.AddRedisInitMqSetup();
//EventBus
//services.AddEventBusSetup();
//SignalR
//services.AddSignalR().AddNewtonsoftJsonProtocol();
//kestrel
//services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true)
// .Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);
//Controller
services.AddControllers(o =>
{
// 全局异常过滤
o.Filters.Add(typeof(GlobalExceptionsFilter));
// 全局路由权限公约
//o.Conventions.Insert(0, new GlobalRouteAuthorizeConvention());
// 全局路由前缀,统一修改路由
o.Conventions.Insert(0, new GlobalRoutePrefixFilter(new RouteAttribute(RoutePrefix.Name)));
})
//全局配置Json序列化处理
.AddNewtonsoftJson(options =>
{
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//不使用驼峰样式的key
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
//忽略Model中为null的属性
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
// 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
//设置本地时间而非UTC时间
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
});
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
//支持编码大全 例如:支持 System.Text.Encoding.GetEncoding("GB2312") System.Text.Encoding.GetEncoding("GB18030")
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
}
//private X509Certificate2 GetCertificate()
//{
// var assembly = typeof(Startup).GetTypeInfo().Assembly;
// using (var stream = assembly.GetManifestResourceStream(
// assembly.GetManifestResourceNames().First(r => r.EndsWith("cnblogs.pfx"))))
// {
// if (stream == null)
// throw new ArgumentNullException(nameof(stream));
// var bytes = new byte[stream.Length];
// stream.Read(bytes, 0, bytes.Length);
// return new X509Certificate2(bytes);
// }
//}
/// <summary>
/// 注意在Program.CreateHostBuilder添加Autofac服务工厂
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModuleRegister());
builder.RegisterModule<AutofacPropertityModuleReg>();
}
/// <summary>
/// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ISysTasksQzService tasksQzService,
ISchedulerCenter schedulerCenter, IRunPlcService plc)
{
// Ip限流,尽量放管道外层
app.UseIpLimitMildd();
// 记录请求与返回数据
app.UseReuestResponseLog();
// 用户访问记录(必须放到外层,不然如果遇到异常,会报错,因为不能返回流)
app.UseRecordAccessLogsMildd();
// signalr
//app.UseSignalRSendMildd();
// 记录ip请求
app.UseIPLogMildd();
if (env.IsDevelopment())
{
// 在开发环境中,使用异常页面,这样可以暴露错误堆栈信息,所以不要放在生产环境。
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// 在非开发环境中使用HTTP严格安全传输(or HSTS) 对于保护web安全是非常重要的。
// 强制实施 HTTPS 在 ASP.NET Core配合 app.UseHttpsRedirection
//app.UseHsts();
}
// 封装Swagger展示
app.UseSwaggerMildd(() => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("Admin.Core.Api.index.html"));
// ↓↓↓↓↓↓ 注意下边这些中间件的顺序,很重要 ↓↓↓↓↓↓
// CORS跨域
app.UseCors(Appsettings.app(new string[] { "Startup", "Cors", "PolicyName" }));
// 跳转https
//app.UseHttpsRedirection();
// 使用静态文件,注意:如果开启需在对应目录创建文件夹,否则会报错
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "file")),
RequestPath = "/file",
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
}
});
// 使用静态文件
app.UseStaticFiles();
app.UseSession();
//app.UseCookiePolicy();
// 返回错误码
app.UseStatusCodePages();
// Routing
app.UseRouting();
// 自定义授权中间件,可以尝试,但不推荐
// app.UseJwtTokenAuth();
// 先开启认证
app.UseAuthentication();
// 然后是授权中间件
app.UseAuthorization();
//开启性能分析
//app.UseMiniProfilerMildd();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
//使用集线器
//endpoints.MapHub<ChatHub>("/chatHub");
//GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;
});
// 开启QuartzNetJob调度服务
app.UseQuartzJobMildd(tasksQzService, schedulerCenter);
//PLC
app.UsePlcMildd(plc);
// 服务注册
//app.UseConsulMildd(Configuration, lifetime);
// 事件总线,订阅服务
//app.ConfigureEventBus();
}
}
}

@ -0,0 +1,229 @@
{
"AllowedHosts": "*",
"Logging": {
"LogLevel": {
"Default": "Information", //Defaultlog4net
"Admin.Core.Extensions.ApiResponseHandler": "Error"
},
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning",
"Microsoft.Hosting.Lifetime": "Debug"
}
},
"Log4Net": {
"Name": "Admin.Core"
}
},
"AppSettings": {
"RedisCachingAOP": {
"Enabled": false,
"ConnectionString": ""
},
"MemoryCachingAOP": {
"Enabled": false
},
"LogAOP": {
"Enabled": false
},
"TranAOP": {
"Enabled": false
},
"SqlAOP": {
"Enabled": false,
"OutToLogFile": {
"Enabled": false
},
"OutToConsole": {
"Enabled": false
}
},
"FileRootPath": "/file/",
"Date": "2018-08-28",
"Author": "Admin.Core",
"UseLoadTest": true,
"CacheTimeOut": 60, //
"ApiRoot": "http://localhost:55014"
},
"Audience": {
"Secret": "dk6Vv3oTuo2OMU18w86E3j11DtM7RUX5icQtA0DCKuhYDRUqBLIiL", //16+
"SecretFile": "E:\\my-file\\admin.core.audience.secret.txt", //Secret
"Issuer": "Admin.Core",
"Audience": "wr",
"Expiration": "6000000" //
},
// MainDBConnId,Enabledtrue
// *** MutiDBEnabled false ***
// *** MutiDBEnabled trueEnabledtrue **
// https://www.bilibili.com/video/BV1BJ411B7mn?p=6
"MainDB": "ADMIN_SQLITE", //Enabledtrue
"MutiDBEnabled": false, //
"CQRSEnabled": false, //SqlServer
"DBS": [
/*
DBType
MySql = 0,
SqlServer = 1,
Sqlite = 2,
Oracle = 3,
PostgreSQL = 4,
Dm = 5,//
Kdbndp = 6,//
*/
{
"ConnId": "ADMIN_SQLITE",
"DBType": 1,
"Enabled": true,
"HitRate": 50,
//"Connection": "Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=Admin.Core;",
"Connection": "Data Source=localhost;Initial Catalog=cwss_xl;User ID=sa;Password=sa;Integrated Security=false;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"Connection": "Data Source=.;Initial Catalog=RCEP_Market;User ID=sa;Password=Password01!;Integrated Security=false;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"Connection": "db/hw.db",
"ProviderName": "System.Data.SqlClient"
}
],
"Startup": {
"Cors": {
"PolicyName": "CorsIpAccess", //
"EnableAllIPs": true, //trueIP访
// /localhost:8000/
// http://127.0.0.1:1818 http://localhost:1818
"IPs": "http://localhost:81,http://127.0.0.1:81"
},
"AppConfigAlert": {
"Enabled": true
},
"ApiName": "Admin.Core",
"IdentityServer4": {
"Enabled": false, // false使jwttrue使Ids4
"AuthorizationUrl": "http://localhost:5004", //
"ApiName": "admin.core.api" //
},
"RedisMq": {
"Enabled": false //redis
},
"MiniProfiler": {
"Enabled": false //
},
"Nacos": {
"Enabled": false //Nacos
}
},
"Redis": {
//"ConnectionString": "127.0.0.1:6379"
"ConnectionString": "127.0.0.1:6379"
},
"RabbitMQ": {
"Enabled": true,
"Connection": "http://localhost:15672/",
"UserName": "robin",
"Password": "123456",
"RetryCount": 3
},
"Siemens": {
"ConString": "192.168.10.100",
"Port": 102
},
"EventBus": {
"Enabled": true,
"SubscriptionClientName": "Admin.Core"
},
"Middleware": {
"RequestResponseLog": {
"Enabled": true
},
"Plc": {
"Enabled": true
},
"IPLog": {
"Enabled": false
},
"RecordAccessLogs": {
"Enabled": true,
"IgnoreApis": ""
},
"SignalR": {
"QuartzNetJob": null,
"Enabled": true
},
"QuartzNetJob": {
"Enabled": true
},
"Consul": {
"Enabled": false
},
"IpRateLimit": {
"Enabled": false
}
},
"PLCServer": [
{
"Id": 1,
"EquipName": "小料PLC",
"IP": "127.0.0.1",
"Port": 102
},
{
"Id": 2,
"EquipName": "溶剂PLC",
"IP": "127.0.0.1",
"Port": 102
}
],
"IpRateLimiting": {
"EnableEndpointRateLimiting": false, //False: globally executed, true: executed for each
"StackBlockedRequests": false, //False: Number of rejections should be recorded on another counter
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"IpWhitelist": [], //
"EndpointWhitelist": [ "get:/api/xxx", "*:/api/yyy" ],
"ClientWhitelist": [ "dev-client-1", "dev-client-2" ],
"QuotaExceededResponse": {
"Content": "{{\"status\":429,\"msg\":\"访问过于频繁,请稍后重试\",\"success\":false}}",
"ContentType": "application/json",
"StatusCode": 429
},
"HttpStatusCode": 429, //
"GeneralRules": [ //api,*
{
"Endpoint": "*:/api/Admin*",
"Period": "1m",
"Limit": 20
},
{
"Endpoint": "*/api/*",
"Period": "1s",
"Limit": 3
},
{
"Endpoint": "*/api/*",
"Period": "1m",
"Limit": 30
},
{
"Endpoint": "*/api/*",
"Period": "12h",
"Limit": 500
}
]
},
"LogFiedOutPutConfigs": {
"tcpAddressHost": "", // elktcp
"tcpAddressPort": 0, // elktcp
"ConfigsInfo": [ // elk
{
"FiedName": "applicationName",
"FiedValue": "Admin.Core.Api"
}
]
}
}

@ -0,0 +1,229 @@
{
"AllowedHosts": "*",
"Logging": {
"LogLevel": {
"Default": "Information", //Defaultlog4net
"Admin.Core.Extensions.ApiResponseHandler": "Error"
},
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning",
"Microsoft.Hosting.Lifetime": "Debug"
}
},
"Log4Net": {
"Name": "Admin.Core"
}
},
"AppSettings": {
"RedisCachingAOP": {
"Enabled": false,
"ConnectionString": ""
},
"MemoryCachingAOP": {
"Enabled": false
},
"LogAOP": {
"Enabled": false
},
"TranAOP": {
"Enabled": false
},
"SqlAOP": {
"Enabled": false,
"OutToLogFile": {
"Enabled": false
},
"OutToConsole": {
"Enabled": false
}
},
"FileRootPath": "/file/",
"Date": "2018-08-28",
"Author": "Admin.Core",
"UseLoadTest": true,
"CacheTimeOut": 60, //
"ApiRoot": "http://localhost:55014"
},
"Audience": {
"Secret": "dk6Vv3oTuo2OMU18w86E3j11DtM7RUX5icQtA0DCKuhYDRUqBLIiL", //16+
"SecretFile": "E:\\my-file\\admin.core.audience.secret.txt", //Secret
"Issuer": "Admin.Core",
"Audience": "wr",
"Expiration": "6000000" //
},
// MainDBConnId,Enabledtrue
// *** MutiDBEnabled false ***
// *** MutiDBEnabled trueEnabledtrue **
// https://www.bilibili.com/video/BV1BJ411B7mn?p=6
"MainDB": "ADMIN_SQLITE", //Enabledtrue
"MutiDBEnabled": false, //
"CQRSEnabled": false, //SqlServer
"DBS": [
/*
DBType
MySql = 0,
SqlServer = 1,
Sqlite = 2,
Oracle = 3,
PostgreSQL = 4,
Dm = 5,//
Kdbndp = 6,//
*/
{
"ConnId": "ADMIN_SQLITE",
"DBType": 1,
"Enabled": true,
"HitRate": 50,
//"Connection": "Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=Admin.Core;",
"Connection": "Data Source=localhost;Initial Catalog=cwss_xl;User ID=sa;Password=sa;Integrated Security=false;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"Connection": "Data Source=.;Initial Catalog=RCEP_Market;User ID=sa;Password=Password01!;Integrated Security=false;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"Connection": "db/hw.db",
"ProviderName": "System.Data.SqlClient"
}
],
"Startup": {
"Cors": {
"PolicyName": "CorsIpAccess", //
"EnableAllIPs": true, //trueIP访
// /localhost:8000/
// http://127.0.0.1:1818 http://localhost:1818
"IPs": "http://localhost:81,http://127.0.0.1:81"
},
"AppConfigAlert": {
"Enabled": true
},
"ApiName": "Admin.Core",
"IdentityServer4": {
"Enabled": false, // false使jwttrue使Ids4
"AuthorizationUrl": "http://localhost:5004", //
"ApiName": "admin.core.api" //
},
"RedisMq": {
"Enabled": false //redis
},
"MiniProfiler": {
"Enabled": false //
},
"Nacos": {
"Enabled": false //Nacos
}
},
"Redis": {
//"ConnectionString": "127.0.0.1:6379"
"ConnectionString": "127.0.0.1:6379"
},
"RabbitMQ": {
"Enabled": true,
"Connection": "http://localhost:15672/",
"UserName": "robin",
"Password": "123456",
"RetryCount": 3
},
"Siemens": {
"ConString": "192.168.10.100",
"Port": 102
},
"EventBus": {
"Enabled": true,
"SubscriptionClientName": "Admin.Core"
},
"Middleware": {
"RequestResponseLog": {
"Enabled": true
},
"Plc": {
"Enabled": true
},
"IPLog": {
"Enabled": false
},
"RecordAccessLogs": {
"Enabled": true,
"IgnoreApis": ""
},
"SignalR": {
"QuartzNetJob": null,
"Enabled": true
},
"QuartzNetJob": {
"Enabled": true
},
"Consul": {
"Enabled": false
},
"IpRateLimit": {
"Enabled": false
}
},
"PLCServer": [
{
"Id": 1,
"EquipName": "小料PLC",
"IP": "127.0.0.1",
"Port": 102
},
{
"Id": 2,
"EquipName": "溶剂PLC",
"IP": "127.0.0.1",
"Port": 102
}
],
"IpRateLimiting": {
"EnableEndpointRateLimiting": false, //False: globally executed, true: executed for each
"StackBlockedRequests": false, //False: Number of rejections should be recorded on another counter
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"IpWhitelist": [], //
"EndpointWhitelist": [ "get:/api/xxx", "*:/api/yyy" ],
"ClientWhitelist": [ "dev-client-1", "dev-client-2" ],
"QuotaExceededResponse": {
"Content": "{{\"status\":429,\"msg\":\"访问过于频繁,请稍后重试\",\"success\":false}}",
"ContentType": "application/json",
"StatusCode": 429
},
"HttpStatusCode": 429, //
"GeneralRules": [ //api,*
{
"Endpoint": "*:/api/Admin*",
"Period": "1m",
"Limit": 20
},
{
"Endpoint": "*/api/*",
"Period": "1s",
"Limit": 3
},
{
"Endpoint": "*/api/*",
"Period": "1m",
"Limit": 30
},
{
"Endpoint": "*/api/*",
"Period": "12h",
"Limit": 500
}
]
},
"LogFiedOutPutConfigs": {
"tcpAddressHost": "", // elktcp
"tcpAddressPort": 0, // elktcp
"ConfigsInfo": [ // elk
{
"FiedName": "applicationName",
"FiedValue": "Admin.Core.Api"
}
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

@ -0,0 +1,115 @@

<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--极速模式-->
<meta name="renderer" content="webkit" />
<meta name="force-rendering" content="webkit" />
<title>%(DocumentTitle)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="./swagger-ui.css">
<link rel="icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
<style>
html {
box-sizing: border-box;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}
.qqgroup {
position: absolute;
top: 67px;
right: 10px;
}
.info {
float: left;
}
.download-contents {
display: none;
}
</style>
%(HeadContent)
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
<defs>
<symbol viewBox="0 0 20 20" id="unlocked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
</symbol>
<symbol viewBox="0 0 20 20" id="locked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z" />
</symbol>
<symbol viewBox="0 0 20 20" id="close">
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow">
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow-down">
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z" />
</symbol>
<symbol viewBox="0 0 24 24" id="jump-to">
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z" />
</symbol>
<symbol viewBox="0 0 24 24" id="expand">
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" />
</symbol>
</defs>
</svg>
<div id="swagger-ui"></div>
<div id="footer" style="text-align: center;margin-bottom: 10px;">
Copyright © 2021
</div>
<!-- Workaround for https://github.com/swagger-api/swagger-editor/issues/1371 -->
<script>
if (window.navigator.userAgent.indexOf("Edge") > -1) {
console.log("Removing native Edge fetch in favor of swagger-ui's polyfill")
window.fetch = undefined;
}
</script>
<script src="./swagger-ui-bundle.js"></script>
<script src="./swagger-ui-standalone-preset.js"></script>
<script>
var int = null;
window.onload = function () {
var configObject = JSON.parse('%(ConfigObject)');
var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');
// Apply mandatory parameters
configObject.dom_id = "#swagger-ui";
configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];
configObject.layout = "StandaloneLayout";
// If oauth2RedirectUrl isn't specified, use the built-in default
if (!configObject.hasOwnProperty("oauth2RedirectUrl"))
configObject.oauth2RedirectUrl = window.location.href.replace("index.html", "oauth2-redirect.html");
// Build a system
const ui = SwaggerUIBundle(configObject);
// Apply OAuth config
ui.initOAuth(oauthConfigObject);
}
</script>
</body>
</html>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<key id="2b589034-183c-46aa-9a57-6462be1caa2e" version="1">
<creationDate>2023-04-07T08:57:30.1585462Z</creationDate>
<activationDate>2023-04-07T08:57:30.1065198Z</activationDate>
<expirationDate>2023-07-06T08:57:30.1065198Z</expirationDate>
<descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
<descriptor>
<encryption algorithm="AES_256_CBC" />
<validation algorithm="HMACSHA256" />
<masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
<!-- Warning: the key below is in an unencrypted form. -->
<value>B+ukm1LwYAOACPilbzxRFH8Q7XKMKeE6ojqU/i+yNwMsXmLlJcoiTbtcYDVri4sH3zgTQfoMvkPDVuoY6nSUDQ==</value>
</masterKey>
</descriptor>
</descriptor>
</key>

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save