Compare commits

..

2 Commits
main ... dev

43 changed files with 534 additions and 44 deletions

View File

@ -16,6 +16,7 @@ namespace Apimanager_backend.Config
CreateMap<Apipackage, PackageInfoDto>(); CreateMap<Apipackage, PackageInfoDto>();
CreateMap<AddPackageDto, Apipackage>(); CreateMap<AddPackageDto, Apipackage>();
CreateMap<OrderDto, Order>(); CreateMap<OrderDto, Order>();
CreateMap<Order, OrderDto>();
CreateMap<PaymentConfig, PaymentConfigDto>(); CreateMap<PaymentConfig, PaymentConfigDto>();
CreateMap<EpayResponse, PayReturnData>() CreateMap<EpayResponse, PayReturnData>()
.ForMember(dest => dest.Success, opt => opt.MapFrom(src => src.code == 1)) .ForMember(dest => dest.Success, opt => opt.MapFrom(src => src.code == 1))

View File

@ -31,6 +31,7 @@ namespace Apimanager_backend.Config
services.AddScoped<ISystemConfigService, SystemConfigService>(); services.AddScoped<ISystemConfigService, SystemConfigService>();
services.AddScoped<IPaymentConfigService, PaymentConfigService>(); services.AddScoped<IPaymentConfigService, PaymentConfigService>();
services.AddScoped<IPayService, PayService>(); services.AddScoped<IPayService, PayService>();
services.AddScoped<ISystemInfoService, SystemInfoService>();
services.AddSingleton<ITokenService, TokenService>(); services.AddSingleton<ITokenService, TokenService>();
services.AddSingleton<IRefreshTokenService, RefreshTokenService>(); services.AddSingleton<IRefreshTokenService, RefreshTokenService>();
services.AddSingleton<IEmailService, EmailService>(); services.AddSingleton<IEmailService, EmailService>();

View File

@ -1,5 +1,6 @@
using Apimanager_backend.Dtos; using Apimanager_backend.Dtos;
using Apimanager_backend.Exceptions; using Apimanager_backend.Exceptions;
using Apimanager_backend.Models;
using Apimanager_backend.Services; using Apimanager_backend.Services;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
@ -47,7 +48,7 @@ namespace Apimanager_backend.Controllers
#endregion #endregion
#region API列表 #region API列表
[HttpGet] [HttpGet]
//[Authorize(Roles = "User")] [Authorize(Roles = "User")]
public async Task<ActionResult<ResponseBase<List<ApiInfoDto>>>> ApiList(int pageIndex,int pageSize,bool desc) public async Task<ActionResult<ResponseBase<List<ApiInfoDto>>>> ApiList(int pageIndex,int pageSize,bool desc)
{ {
var list = await apiService.GetApisAsync(pageIndex, pageSize, desc); var list = await apiService.GetApisAsync(pageIndex, pageSize, desc);
@ -175,5 +176,23 @@ namespace Apimanager_backend.Controllers
} }
} }
#endregion #endregion
#region API列表
[HttpGet]
public async Task<IActionResult> GetApisPublic(int pageIndex,int pageSize,bool desc)
{
var list = await apiService.GetUserApisAsync(pageIndex, pageSize, desc);
var res = new ResponseBase<List<ApiInfoDto>>(1000,"查询成功",list);
return Ok(res);
}
#endregion
#region API所属套餐
[HttpGet]
public async Task<IActionResult> GetApiPackages(int[] apiId)
{
var list = await apiService.GetApipackageAsync(apiId);
var res = new ResponseBase<List<Apipackage>>(1000,"查询成功",list);
return Ok(res);
}
#endregion
} }
} }

View File

@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc;
namespace Apimanager_backend.Controllers namespace Apimanager_backend.Controllers
{ {
[Route("api/[controller][action]")] [Route("api/[controller]/[action]")]
[ApiController] [ApiController]
public class OrderController:ControllerBase public class OrderController:ControllerBase
{ {
@ -44,5 +44,23 @@ namespace Apimanager_backend.Controllers
); );
return Ok(responseData); return Ok(responseData);
} }
//获取订单数量
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<ActionResult<ResponseBase<int>>> GetOrderNum()
{
var num = await _orderService.GetOrderNumAsync();
var res = new ResponseBase<int>(1000,"查询成功",num);
return Ok(res);
}
[HttpGet]
[Authorize(Roles = "User")]
public async Task<ActionResult<ResponseBase<int>>> GetMyOrderNum()
{
string userId = User.Claims.First(x => x.Type == "userId").Value;
var num = await _orderService.GetOrderNumAsync(int.Parse(userId));
var res = new ResponseBase<int>(1000, "查询成功", num);
return Ok(res);
}
} }
} }

View File

@ -169,5 +169,13 @@ namespace Apimanager_backend.Controllers
} }
} }
#endregion #endregion
[HttpPost]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> SetApiPackageItem(ApiPackageItem apiPackageItem)
{
await packageService.SetApiPackageItemAsync(apiPackageItem.ApiId,apiPackageItem.ApiPackageId);
var res = new ResponseBase<object?>(1000,"操作成功",null);
return Ok(res);
}
} }
} }

View File

@ -31,13 +31,13 @@ namespace Apimanager_backend.Controllers
{ {
var userId = User.Claims.First(x => x.Type == "userId").Value; var userId = User.Claims.First(x => x.Type == "userId").Value;
//获取支付接口信息 //获取支付接口信息
var paymentConfig = await _paymentService.GetPaymentConfigInfoByTypeAsync(dto.PaymentType.ToString()); var paymentConfig = await _paymentService.GetPaymentConfigInfoByIdAsync(dto.Id);
//创建订单 //创建订单
OrderDto order = new OrderDto(); OrderDto order = new OrderDto();
order.Amount = dto.Amount; order.Amount = dto.Amount;
order.OrderType = OrderType.Purchase; order.OrderType = OrderType.Recharge;
order.UserId = int.Parse(userId); order.UserId = int.Parse(userId);
order.PaymentType = dto.PaymentType; order.PaymentType = paymentConfig.Method;
Order orderRes = await _orderService.CreateOrderAsync(order); Order orderRes = await _orderService.CreateOrderAsync(order);
switch (paymentConfig.PayType) switch (paymentConfig.PayType)
{ {
@ -93,5 +93,6 @@ namespace Apimanager_backend.Controllers
return Ok(res); return Ok(res);
} }
} }
} }

View File

@ -0,0 +1,54 @@
using Apimanager_backend.Dtos;
using Apimanager_backend.Models;
using Apimanager_backend.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Apimanager_backend.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class PaymentController : ControllerBase
{
private IPaymentConfigService _paymentService;
private ILogger<PaymentController> _logger;
public PaymentController(IPaymentConfigService paymentConfig, ILogger<PaymentController> logger)
{
_paymentService = paymentConfig;
_logger = logger;
}
[HttpPost]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> AddPayment(PaymentConfig payment)
{
await _paymentService.AddPaymentAsync(payment);
var res = new ResponseBase<object?>(1000,"添加成功",null);
return Ok(res);
}
[HttpPost]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> UpdatePayment(PaymentConfig payment)
{
await _paymentService.UpdatePaymentAsync(payment);
var res = new ResponseBase<object?>(1000,"修改成功",null);
return Ok(res);
}
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> GetAllPayment()
{
var list = await _paymentService.GetAllPaymentAdminAsync();
var res = new ResponseBase<List<PaymentConfig>>(1000,"查询成功",list);
return Ok(res);
}
[HttpGet]
[Authorize(Roles = "User")]
public async Task<IActionResult> GetAllPublicPayment()
{
var list = await _paymentService.GetAllPaymentAsync();
var res = new ResponseBase<List<PaymentConfigDto>>(1000, "查询成功", list);
return Ok(res);
}
}
}

View File

@ -0,0 +1,27 @@
using Apimanager_backend.Dtos;
using Apimanager_backend.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Apimanager_backend.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class SystemInfoController : ControllerBase
{
private readonly ISystemInfoService _systemInfoService;
public SystemInfoController(ISystemInfoService systemInfoService)
{
_systemInfoService = systemInfoService;
}
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> GetInfo()
{
var info = await _systemInfoService.GetSystemInfoAsync();
var res = new ResponseBase<SystemInfoDto>(1000,"查询成功",info);
return Ok(res);
}
}
}

View File

@ -198,7 +198,7 @@ namespace Apimanager_backend.Controllers
// 9. 返回成功响应 // 9. 返回成功响应
return Ok(new ResponseBase<object>(1000, "favicon上传成功", null)); return Ok(new ResponseBase<object>(1000, "favicon上传成功", null));
} }
catch (Exception ex) catch (Exception ex) when (!(ex is BaseException))
{ {
_logger.LogError(ex, "Favicon上传失败"); _logger.LogError(ex, "Favicon上传失败");
throw new BaseException(1004, "Favicon上传失败"); throw new BaseException(1004, "Favicon上传失败");

View File

@ -15,9 +15,11 @@ namespace Apimanager_backend.Controllers
public class UserController : ControllerBase public class UserController : ControllerBase
{ {
private readonly IUserService userService; private readonly IUserService userService;
public UserController(IUserService userService) private readonly IUserPackageService _userPackageService;
public UserController(IUserService userService,IUserPackageService userPackageService)
{ {
this.userService = userService; this.userService = userService;
this._userPackageService = userPackageService;
} }
/// <summary> /// <summary>
/// 获取用户个人信息 /// 获取用户个人信息
@ -30,9 +32,9 @@ namespace Apimanager_backend.Controllers
var userId = User.Claims.First(x => x.Type == "userId").Value; var userId = User.Claims.First(x => x.Type == "userId").Value;
var userInfo = await userService.GetUserAsync(int.Parse(userId)); var userInfo = await userService.GetUserAsync(int.Parse(userId));
var res = new ResponseBase<UserInfoDto>( var res = new ResponseBase<UserInfoDto>(
code:1000, code: 1000,
message:"Success", message: "Success",
data:userInfo data: userInfo
); );
return Ok(res); return Ok(res);
} }
@ -42,29 +44,29 @@ namespace Apimanager_backend.Controllers
/// <param name="dto"></param> /// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public async Task<ActionResult<ResponseBase<object?>>> Resetpassword([FromBody]ResetPasswordDto dto) public async Task<ActionResult<ResponseBase<object?>>> Resetpassword([FromBody] ResetPasswordDto dto)
{ {
try try
{ {
await userService.ResetPasswordAsync(dto.Email, dto.Code, dto.NewPassword); await userService.ResetPasswordAsync(dto.Email, dto.Code, dto.NewPassword);
var res = new ResponseBase<object?>( var res = new ResponseBase<object?>(
code:1000, code: 1000,
message:"Success", message: "Success",
data: null data: null
); );
return Ok(res); return Ok(res);
}catch(BaseException e) } catch (BaseException e)
{ {
var res = new ResponseBase<object?>( var res = new ResponseBase<object?>(
code:e.code, code: e.code,
message:e.message, message: e.message,
data:null data: null
); );
return StatusCode(400,res); return StatusCode(400, res);
} }
} }
[HttpPost] [HttpPost]
public async Task<ActionResult<ResponseBase<object?>>> SendResetEmail([FromQuery]string email) public async Task<ActionResult<ResponseBase<object?>>> SendResetEmail([FromQuery] string email)
{ {
await userService.SendResetPasswordEmailAsync(email); await userService.SendResetPasswordEmailAsync(email);
var res = new ResponseBase<object?>( var res = new ResponseBase<object?>(
@ -76,16 +78,37 @@ namespace Apimanager_backend.Controllers
} }
[HttpPost] [HttpPost]
[Authorize(Roles = "User")] [Authorize(Roles = "User")]
public async Task<ActionResult<ResponseBase<UserInfoDto?>>> Update([FromBody]UpdateUserDto dto) public async Task<ActionResult<ResponseBase<UserInfoDto?>>> Update([FromBody] UpdateUserDto dto)
{ {
var userId = User.Claims.First(x => x.Type == "userId").Value; var userId = User.Claims.First(x => x.Type == "userId").Value;
var userInfo = await userService.UpdateUserAsync(int.Parse(userId),dto); var userInfo = await userService.UpdateUserAsync(int.Parse(userId), dto);
var res = new ResponseBase<object?>( var res = new ResponseBase<object?>(
code:1000, code: 1000,
message:"Success", message: "Success",
data:userInfo data: userInfo
); );
return Ok(res); return Ok(res);
} }
//设置用户apikey
[HttpPost]
[Authorize(Roles = "User")]
public async Task<IActionResult> SetApiKey()
{
var userId = User.Claims.First(x => x.Type == "userId").Value;
var key = await userService.SetUserTokenAsync(int.Parse(userId));
var res = new ResponseBase<string>(1000, "操作成功", key);
return Ok(res);
}
//获取已订购套餐
[HttpGet]
[Authorize(Roles = "User")]
public async Task<IActionResult> GetUserPackages()
{
var userId = User.Claims.First(x => x.Type == "userId").Value;
var list = await _userPackageService.GetUserPackagesByUserIdAsync(int.Parse(userId));
var res = new ResponseBase<List<UserPackage>>(1000,"查询成功",list);
return Ok(res);
}
} }
} }

View File

@ -13,5 +13,6 @@ namespace Apimanager_backend.Dtos
public bool IsActive { get; set; } public bool IsActive { get; set; }
public Apipackage? Package { get; set; } public Apipackage? Package { get; set; }
public int? PackageId { get; set; } public int? PackageId { get; set; }
public List<ApiRequestExample>? ApiRequestExamples { get; set; }
} }
} }

View File

@ -5,6 +5,7 @@ namespace Apimanager_backend.Dtos
{ {
public class CreatePaymentDto public class CreatePaymentDto
{ {
public int Id { get; set; }
public PaymentType PaymentType { get; set; } public PaymentType PaymentType { get; set; }
[Required] [Required]
public decimal Amount { get; set; } public decimal Amount { get; set; }

View File

@ -41,5 +41,6 @@ namespace Apimanager_backend.Dtos
public string? Description { get; set; } // varchar(255) public string? Description { get; set; } // varchar(255)
public OrderStatus Status { get; set; } public OrderStatus Status { get; set; }
public User? User { get; set; }
} }
} }

View File

@ -1,4 +1,6 @@
namespace Apimanager_backend.Dtos using Apimanager_backend.Models;
namespace Apimanager_backend.Dtos
{ {
public class PackageInfoDto public class PackageInfoDto
{ {
@ -7,6 +9,7 @@
public int CallLimit { get; set; } public int CallLimit { get; set; }
public decimal Price { get; set; } public decimal Price { get; set; }
public int OneMinuteLimit { get; set; } public int OneMinuteLimit { get; set; }
public ICollection<ApiPackageItem> ApiPackageItems { get; set; }
} }
} }

View File

@ -0,0 +1,22 @@
using Apimanager_backend.Models;
using System.ComponentModel.DataAnnotations;
namespace Apimanager_backend.Dtos
{
public class PaymentDto
{
public int Id { get; set; }
/// <summary>支付方式(如 Alipay、WeChat、Stripe...</summary>
[Required]
public PaymentType Method { get; set; } // varchar(50)
/// <summary>是否启用此配置</summary>
public bool IsEnabled { get; set; } = true;
/// <summary>备注</summary>
public string? Description { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Apimanager_backend.Dtos
{
public class SystemInfoDto
{
public int UserCount { get; set; }
public int OrderCount { get; set; }
public int CallCount { get; set; }
public decimal Money { get; set; }
public List<UserInfoDto> RecentUser { get; set; }
public List<OrderDto> RecentOrder { get; set; }
}
}

View File

@ -12,6 +12,7 @@ namespace Apimanager_backend.Dtos
public decimal Balance { get; set; } public decimal Balance { get; set; }
public string? Avatar { get; set; } public string? Avatar { get; set; }
public DateTime Created { get; set; } public DateTime Created { get; set; }
public string? ApiKey { get; set; }
public List<UserPackage>? Packages { get; set; } public List<UserPackage>? Packages { get; set; }
} }
} }

View File

@ -8,6 +8,11 @@ namespace Apimanager_backend.Filters.ExceptionFilter
{ {
public class generalExceptionFilter : IExceptionFilter public class generalExceptionFilter : IExceptionFilter
{ {
private ILogger<generalExceptionFilter> _logger;
public generalExceptionFilter(ILogger<generalExceptionFilter> logger)
{
_logger = logger;
}
public void OnException(ExceptionContext context) public void OnException(ExceptionContext context)
{ {
if(context.Exception is BaseException) if(context.Exception is BaseException)
@ -25,6 +30,20 @@ namespace Apimanager_backend.Filters.ExceptionFilter
}; };
context.ExceptionHandled = true; context.ExceptionHandled = true;
} }
if(context.Exception is Exception ex)
{
_logger.LogError(ex, "系统未处理异常:{Message}", ex.Message);
var res = new ResponseBase<object?>(
code: 1005,
message: "服务器内部错误,请联系管理员。",
data: null
);
context.Result = new JsonResult(res)
{
StatusCode = 500
};
context.ExceptionHandled = true;
}
} }
} }
} }

View File

@ -1,5 +1,6 @@
using Apimanager_backend.Data; using Apimanager_backend.Data;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace Apimanager_backend.Models namespace Apimanager_backend.Models
{ {
@ -57,9 +58,13 @@ namespace Apimanager_backend.Models
public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // timestamp public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // timestamp
//导航属性 //导航属性
[JsonIgnore]
public Apipackage? Package { get; set; } public Apipackage? Package { get; set; }
public ICollection<ApiPackageItem> ApiPackageItems { get; set; } [JsonIgnore]
public ICollection<ApiCallLog> ApiCalls { get; set; } public ICollection<ApiPackageItem>? ApiPackageItems { get; set; }
public ICollection<ApiRequestExample> ApiRequestExamples { get; set; } [JsonIgnore]
public ICollection<ApiCallLog>? ApiCalls { get; set; }
[JsonIgnore]
public ICollection<ApiRequestExample>? ApiRequestExamples { get; set; }
} }
} }

View File

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace Apimanager_backend.Models namespace Apimanager_backend.Models
{ {
@ -8,9 +9,10 @@ namespace Apimanager_backend.Models
public int Id { get; set; } public int Id { get; set; }
public int ApiPackageId { get; set; } public int ApiPackageId { get; set; }
public Apipackage ApiPackage { get; set; } = null!; [JsonIgnore]
public Apipackage? ApiPackage { get; set; } = null!;
public int ApiId { get; set; } public int ApiId { get; set; }
public Api Api { get; set; } = null!; public Api? Api { get; set; } = null!;
} }
} }

View File

@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace Apimanager_backend.Models namespace Apimanager_backend.Models
{ {
@ -45,6 +46,7 @@ namespace Apimanager_backend.Models
//导航属性 //导航属性
public ICollection<Api> Apis { get; set; } public ICollection<Api> Apis { get; set; }
public ICollection<ApiPackageItem> ApiPackageItems { get; set; } public ICollection<ApiPackageItem> ApiPackageItems { get; set; }
[JsonIgnore]
public ICollection<UserPackage> Packages { get; set; } public ICollection<UserPackage> Packages { get; set; }
} }

View File

@ -2,8 +2,8 @@
{ {
public enum OrderType public enum OrderType
{ {
Recharge, Purchase = 0,
Purchase, Recharge = 1,
Refund Refund = 2
} }
} }

View File

@ -5,6 +5,7 @@
AliPay = 0, AliPay = 0,
WxPay = 1, WxPay = 1,
Bank = 2, Bank = 2,
QQPay =3 QQPay =3,
balance = 4
} }
} }

View File

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace Apimanager_backend.Models namespace Apimanager_backend.Models
{ {
@ -57,9 +58,12 @@ namespace Apimanager_backend.Models
public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // Timestamp public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // Timestamp
//导航属性 //导航属性
[JsonIgnore]
public ICollection<UserPackage> Packages { get; set; } public ICollection<UserPackage> Packages { get; set; }
[JsonIgnore]
public ICollection<OperationLog> operationLogs { get; set; } public ICollection<OperationLog> operationLogs { get; set; }
public ICollection<ApiCallLog> CallLogs { get; set; } public ICollection<ApiCallLog> CallLogs { get; set; }
[JsonIgnore]
public ICollection<Order> Orders { get; set; } public ICollection<Order> Orders { get; set; }
public ICollection<UserRole> Roles { get; set; } = new List<UserRole>(); public ICollection<UserRole> Roles { get; set; } = new List<UserRole>();
public User(int id,string username,string email,string passHash) public User(int id,string username,string email,string passHash)

View File

@ -1,4 +1,6 @@
namespace Apimanager_backend.Models using System.Text.Json.Serialization;
namespace Apimanager_backend.Models
{ {
public class UserPackage public class UserPackage
{/// <summary> {/// <summary>

View File

@ -127,5 +127,30 @@ namespace Apimanager_backend.Services
return mapper.Map<ApiInfoDto>(apiInfo); return mapper.Map<ApiInfoDto>(apiInfo);
} }
#endregion #endregion
#region api列表
public async Task<List<ApiInfoDto>> GetUserApisAsync(int pageIndex, int pageSize, bool desc)
{
IQueryable<Api> query = context.Apis.Include(x => x.ApiRequestExamples).AsQueryable();
//倒序
if (desc)
{
query.OrderDescending();
}
//分页
query = query.Skip((pageIndex - 1) * pageSize).Take(pageSize);
return mapper.Map<List<ApiInfoDto>>(await query.ToListAsync());
}
#endregion
#region API对应的套餐
public async Task<List<Apipackage>> GetApipackageAsync(int[] apiId)
{
if(apiId.Count() == 0)
{
throw new BaseException(1004,"id不能为空");
}
var packageItems = await context.apiPackageItems.Include(x => x.ApiPackage).Where(x => apiId.Contains(x.ApiId)).ToListAsync();
return packageItems.Select(x => x.ApiPackage).ToList();
}
#endregion
} }
} }

View File

@ -5,6 +5,6 @@ namespace Apimanager_backend.Services
{ {
public interface IApiPackageItemService public interface IApiPackageItemService
{ {
Task<List<ApiPackageItem>> GetApiPackageItemsByApiIdAsync(int ApiId); public Task<List<ApiPackageItem>> GetApiPackageItemsByApiIdAsync(int ApiId);
} }
} }

View File

@ -1,4 +1,5 @@
using Apimanager_backend.Dtos; using Apimanager_backend.Dtos;
using Apimanager_backend.Models;
namespace Apimanager_backend.Services namespace Apimanager_backend.Services
{ {
@ -61,6 +62,15 @@ namespace Apimanager_backend.Services
/// <param name="endpoint">api路径</param> /// <param name="endpoint">api路径</param>
/// <returns></returns> /// <returns></returns>
public Task<ApiInfoDto> GetApiInfoByEndpointAsync(string endpoint); public Task<ApiInfoDto> GetApiInfoByEndpointAsync(string endpoint);
/// <summary>
/// 获取用于用户展示的api列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="desc"></param>
/// <returns></returns>
public Task<List<ApiInfoDto>> GetUserApisAsync(int pageIndex, int pageSize, bool desc);
public Task<List<Apipackage>> GetApipackageAsync(int[] apiId);
} }
} }

View File

@ -20,5 +20,6 @@ namespace Apimanager_backend.Services
/// <returns></returns> /// <returns></returns>
Task<Order> CreateOrderAsync(OrderDto order); Task<Order> CreateOrderAsync(OrderDto order);
Task<bool> UpdateOrderAsync(OrderDto order); Task<bool> UpdateOrderAsync(OrderDto order);
Task<int> GetOrderNumAsync(int? userId = null);
} }
} }

View File

@ -59,6 +59,7 @@ namespace Apimanager_backend.Services
/// <param name="time"></param> /// <param name="time"></param>
/// <returns></returns> /// <returns></returns>
public Task<UserPackage> DecuteUserPackageTimeAsync(int packageId,int userId,TimeSpan time); public Task<UserPackage> DecuteUserPackageTimeAsync(int packageId,int userId,TimeSpan time);
Task<bool> SetApiPackageItemAsync(int apiId,int packageId);
} }

View File

@ -5,6 +5,11 @@ namespace Apimanager_backend.Services
public interface IPaymentConfigService public interface IPaymentConfigService
{ {
Task<PaymentConfig> GetPaymentConfigInfoByTypeAsync(string payType); Task<PaymentConfig> GetPaymentConfigInfoByTypeAsync(string payType);
Task<PaymentConfig> GetPaymentConfigInfoByIdAsync(int id);
Task<PaymentConfig> GetPaymentAdminAsync(PayType payType, PaymentType paymentType);
Task<List<PaymentConfigDto>> GetAllPaymentAsync(); Task<List<PaymentConfigDto>> GetAllPaymentAsync();
Task<List<PaymentConfig>> GetAllPaymentAdminAsync();
Task<bool> AddPaymentAsync(PaymentConfig payment);
Task<bool> UpdatePaymentAsync(PaymentConfig payment);
} }
} }

View File

@ -0,0 +1,9 @@
using Apimanager_backend.Dtos;
namespace Apimanager_backend.Services
{
public interface ISystemInfoService
{
Task<SystemInfoDto> GetSystemInfoAsync();
}
}

View File

@ -60,5 +60,11 @@ namespace Apimanager_backend.Services
/// <param name="url"></param> /// <param name="url"></param>
/// <returns></returns> /// <returns></returns>
Task<bool> UpdateUserAvatarAsync(int userId,string url); Task<bool> UpdateUserAvatarAsync(int userId,string url);
/// <summary>
/// 设置用户调用凭证
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<string> SetUserTokenAsync(int userId);
} }
} }

View File

@ -49,6 +49,29 @@ namespace Apimanager_backend.Services
} }
} }
#endregion #endregion
public async Task<int> GetOrderNumAsync(int? userId = null)
{
try
{
int num = 0;
if (userId != null)
{
num = await _apiContext.Orders.CountAsync(x => x.UserId == userId);
}
else
{
num = await _apiContext.Orders.CountAsync();
}
return num;
}catch(Exception e)
{
logger.LogError(e, "查询订单数量:{Message}", e.Message);
throw new BaseException(1005,"服务器内部错误");
}
}
#region #region
/// <summary> /// <summary>
/// 获取订单列表 /// 获取订单列表
@ -60,10 +83,10 @@ namespace Apimanager_backend.Services
/// <returns></returns> /// <returns></returns>
public async Task<List<Order>> GetOrdersAsync(int pageIndex, int pageSize, bool desc, int? userId) public async Task<List<Order>> GetOrdersAsync(int pageIndex, int pageSize, bool desc, int? userId)
{ {
IQueryable<Order> query = _apiContext.Orders.AsQueryable().OrderBy(x => x.Id); IQueryable<Order> query = _apiContext.Orders.Include(x => x.User).AsQueryable().OrderBy(x => x.Id);
if(userId != null) if(userId != null)
{ {
query.Where(x => x.UserId == userId); query = query.Where(x => x.UserId == userId);
} }
//倒序 //倒序
if (desc) if (desc)
@ -90,12 +113,12 @@ namespace Apimanager_backend.Services
data.UpdatedAt = DateTime.Now; data.UpdatedAt = DateTime.Now;
data.Status = order.Status; data.Status = order.Status;
data.PaiAt = order.Status == OrderStatus.Completed ? DateTime.Now : null; data.PaiAt = order.Status == OrderStatus.Completed ? DateTime.Now : null;
var user = await _apiContext.Users.FirstOrDefaultAsync(x => x.Id == order.UserId); var user = await _apiContext.Users.FirstOrDefaultAsync(x => x.Id == data.UserId);
if (user == null) if (user == null)
{ {
throw new BaseException(2004, "用户未找到"); throw new BaseException(2004, "用户未找到");
} }
user.Balance += order.Amount; user.Balance += data.Amount;
_apiContext.Orders.Update(data); _apiContext.Orders.Update(data);
_apiContext.Users.Update(user); _apiContext.Users.Update(user);
await _apiContext.SaveChangesAsync(); await _apiContext.SaveChangesAsync();

View File

@ -139,7 +139,7 @@ namespace Apimanager_backend.Services
#region #region
public async Task<List<PackageInfoDto>> GetAllPackagesAsync(int pageIndex, int pageSize, bool desc) public async Task<List<PackageInfoDto>> GetAllPackagesAsync(int pageIndex, int pageSize, bool desc)
{ {
IQueryable<Apipackage> query = apiContext.Apipackages.Where(x => true).OrderBy(x => x.Id); IQueryable<Apipackage> query = apiContext.Apipackages.Include(x => x.ApiPackageItems).ThenInclude(x => x.Api).Where(x => true).OrderBy(x => x.Id);
if(desc) if(desc)
{ {
query = query.OrderDescending(); query = query.OrderDescending();
@ -160,9 +160,9 @@ namespace Apimanager_backend.Services
public async Task<PackageInfoDto> PackageInfoByIdAsync(int packageId) public async Task<PackageInfoDto> PackageInfoByIdAsync(int packageId)
{ {
var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId); var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId);
if(packageInfo == null) if (packageInfo == null)
{ {
throw new BaseException(4004,"套餐未找到"); throw new BaseException(4004, "套餐未找到");
} }
return mapper.Map<PackageInfoDto>(packageInfo); return mapper.Map<PackageInfoDto>(packageInfo);
} }
@ -197,5 +197,23 @@ namespace Apimanager_backend.Services
} }
} }
#endregion #endregion
#region API关联套餐
public async Task<bool> SetApiPackageItemAsync(int apiId, int packageId)
{
var api = await apiContext.Apis.SingleOrDefaultAsync(x => x.Id == apiId);
if(api == null)
{
throw new BaseException(1004,"API不存在");
}
var package = await apiContext.Apipackages.SingleOrDefaultAsync(x => x.Id == packageId);
if(package is null)
{
throw new BaseException(1004,"套餐不存在");
}
apiContext.apiPackageItems.Add(new ApiPackageItem() { ApiPackageId = package.Id,ApiId = api.Id});
await apiContext.SaveChangesAsync();
return true;
}
#endregion
} }
} }

View File

@ -47,10 +47,23 @@ namespace Apimanager_backend.Services
else else
{ {
var baseDate = uPackage.ExpiryDate > DateTime.Now ? uPackage.ExpiryDate : DateTime.Now; var baseDate = uPackage.ExpiryDate > DateTime.Now ? uPackage.ExpiryDate : DateTime.Now;
uPackage.ExpiryDate = baseDate.AddMonths(1);
uPackage.RemainingCalls += package.CallLimit;
_context.UserPackages.Update(uPackage); _context.UserPackages.Update(uPackage);
} }
user.Balance -= package.Price; user.Balance -= package.Price;
_context.Users.Update(user); _context.Users.Update(user);
Order order = new Order()
{
UserId = user.Id,
OrderNumber = OrderNumberGenerator.Generate(user.Id),
Amount = package.Price,
OrderType = OrderType.Purchase,
PaymentType = PaymentType.balance,
Status = OrderStatus.Completed,
PaiAt = DateTime.Now
};
_context.Orders.Add(order);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
await transaction.CommitAsync(); await transaction.CommitAsync();
return true; return true;

View File

@ -17,12 +17,45 @@ namespace Apimanager_backend.Services
_logger = logger; _logger = logger;
_mapper = mapper; _mapper = mapper;
} }
public async Task<bool> AddPaymentAsync(PaymentConfig payment)
{
bool res = await _context.paymentConfigs.AnyAsync(x => x.PayType == payment.PayType && x.Method == payment.Method);
if (res)
{
throw new BaseException(1006,"该支付方式已存在");
}
_context.paymentConfigs.Add(payment);
await _context.SaveChangesAsync();
return true;
}
public async Task<List<PaymentConfig>> GetAllPaymentAdminAsync()
{
return await _context.paymentConfigs.ToListAsync();
}
public async Task<List<PaymentConfigDto>> GetAllPaymentAsync() public async Task<List<PaymentConfigDto>> GetAllPaymentAsync()
{ {
var data = await _context.paymentConfigs.Where(x => x.IsEnabled).ToListAsync(); var data = await _context.paymentConfigs.Where(x => x.IsEnabled).ToListAsync();
return _mapper.Map<List<PaymentConfigDto>>(data); return _mapper.Map<List<PaymentConfigDto>>(data);
} }
public Task<PaymentConfig> GetPaymentAdminAsync(PayType payType, PaymentType paymentType)
{
throw new NotImplementedException();
}
public async Task<PaymentConfig> GetPaymentConfigInfoByIdAsync(int id)
{
var payment = await _context.paymentConfigs.SingleOrDefaultAsync(x => x.Id == id);
if(payment is null)
{
throw new BaseException(1004,"未找到支付接口");
}
return payment;
}
public async Task<PaymentConfig> GetPaymentConfigInfoByTypeAsync(string payType) public async Task<PaymentConfig> GetPaymentConfigInfoByTypeAsync(string payType)
{ {
if(!Enum.TryParse(payType, true, out PaymentType parsedPayType)) if(!Enum.TryParse(payType, true, out PaymentType parsedPayType))
@ -36,5 +69,31 @@ namespace Apimanager_backend.Services
} }
return data; return data;
} }
public async Task<bool> UpdatePaymentAsync(PaymentConfig payment)
{
var paymentConfig = await _context.paymentConfigs.FirstOrDefaultAsync(x => x.Id == payment.Id);
if(paymentConfig == null)
{
_context.paymentConfigs.Add(payment);
}
else
{
paymentConfig.AppId = payment.AppId;
paymentConfig.SecretKey = payment.SecretKey;
paymentConfig.PublicKey = payment.PublicKey;
paymentConfig.IsEnabled = payment.IsEnabled;
paymentConfig.Url = payment.Url;
paymentConfig.Description = payment.Description;
paymentConfig.ExtraSettingsJson = payment.ExtraSettingsJson;
paymentConfig.GatewayUrl = payment.GatewayUrl;
paymentConfig.PayType = payment.PayType;
paymentConfig.Method = payment.Method;
paymentConfig.NotifyUrl = payment.NotifyUrl;
_context.paymentConfigs.Update(paymentConfig);
}
await _context.SaveChangesAsync();
return true;
}
} }
} }

View File

@ -0,0 +1,70 @@
using Apimanager_backend.Data;
using Apimanager_backend.Dtos;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
namespace Apimanager_backend.Services
{
public class SystemInfoService : ISystemInfoService
{
private readonly ApiContext _context;
private readonly IMapper _mapper;
public SystemInfoService(ApiContext apiContext,IMapper mapper)
{
_context = apiContext;
_mapper = mapper;
}
public async Task<SystemInfoDto> GetSystemInfoAsync()
{
return new SystemInfoDto()
{
UserCount = await GetUserCount(),
OrderCount = await GetOrderCount(),
CallCount = await GetCallCount(),
Money = await GetMoney(),
RecentOrder = await GetRecentOrder(),
RecentUser = await GetRecentUser()
};
}
#region
private async Task<int> GetUserCount()
{
return await _context.Users.CountAsync();
}
#endregion
#region
private async Task<int> GetOrderCount()
{
return await _context.Orders.CountAsync();
}
#endregion
#region API调用次数
private async Task<int> GetCallCount()
{
return await _context.CallLogs.CountAsync();
}
#endregion
#region
private async Task<List<UserInfoDto>> GetRecentUser()
{
DateTime dateTime = DateTime.Now.AddDays(-7);
var users = _context.Users.Where(x => x.CreatedAt >= dateTime);
return _mapper.Map<List<UserInfoDto>>(await users.ToListAsync());
}
#endregion
#region
private async Task<List<OrderDto>> GetRecentOrder()
{
DateTime dateTime = DateTime.Now.AddDays(-7);
var orders = _context.Orders.Include(x => x.User).Where(x => x.CreatedAt >= dateTime);
return _mapper.Map<List<OrderDto>>(await orders.ToListAsync());
}
#endregion
#region
public async Task<decimal> GetMoney()
{
return await _context.Orders.Where(x => x.OrderType == Models.OrderType.Recharge).SumAsync(x => x.Amount);
}
#endregion
}
}

View File

@ -10,6 +10,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
using StackExchange.Redis; using StackExchange.Redis;
using System.ComponentModel; using System.ComponentModel;
using System.Security.Cryptography;
namespace Apimanager_backend.Services namespace Apimanager_backend.Services
{ {
@ -125,5 +126,25 @@ namespace Apimanager_backend.Services
await apiContext.SaveChangesAsync(); await apiContext.SaveChangesAsync();
return true; return true;
} }
#region apikey
public async Task<string> SetUserTokenAsync(int userId)
{
User? user = await apiContext.Users.FirstOrDefaultAsync(x => x.Id == userId);
if (user is null)
{
throw new BaseException(2004,"用户未找到");
}
var tokenBytes = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(tokenBytes);
}
var tokenStr = Convert.ToBase64String(tokenBytes);
user.ApiKey = tokenStr;
apiContext.Users.Update(user);
await apiContext.SaveChangesAsync();
return tokenStr;
}
#endregion
} }
} }

View File

@ -37,7 +37,8 @@ namespace Apimanager_backend.Tools
using var client = new HttpClient(); using var client = new HttpClient();
var content = new FormUrlEncodedContent(parameters); var content = new FormUrlEncodedContent(parameters);
var response = await client.PostAsync($"{baseUrl}/mapi.php", content); var response = await client.PostAsync($"{baseUrl}/mapi.php", content);
return JsonConvert.DeserializeObject<EpayResponse>(await response.Content.ReadAsStringAsync()); var responseJson = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<EpayResponse>(responseJson);
} }
/// <summary> /// <summary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB