using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.DataProtection.KeyManagement;
|
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.Extensions.Options;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Helper;
|
|
namespace WIDESEA_Core.BaseController
|
{
|
[Authorize, ApiController]
|
public class ApiBaseController<IService, TEntity> : Controller
|
{
|
protected IService Service;
|
|
public ApiBaseController(IService service)
|
{
|
Service = service;
|
}
|
|
/// <summary>
|
/// 获取分页数据
|
/// </summary>
|
/// <param name="options">分页查询参数</param>
|
/// <returns>分页查询结果</returns>
|
[HttpPost, Route("GetPageData")]
|
public virtual ActionResult GetPageData([FromBody] PageDataOptions options)
|
{
|
return Json(InvokeService("GetPageData", new object[] { options }));
|
}
|
|
/// <summary>
|
/// 获取详情页数据
|
/// </summary>
|
/// <param name="pageData">分页查询参数</param>
|
/// <returns>返回详情页数据结果</returns>
|
[HttpPost, Route("GetDetailPage")]
|
public virtual ActionResult GetDetailPage([FromBody] PageDataOptions pageData)
|
{
|
return Json(InvokeService("GetDetailPage", new object[] { pageData }));
|
}
|
|
/// <summary>
|
/// 添加数据
|
/// </summary>
|
/// <param name="options">要添加的实体数据</param>
|
/// <returns>操作结果</returns>
|
[HttpPost, Route("AddData")]
|
public virtual ActionResult AddData([FromBody] TEntity options)
|
{
|
return Json(InvokeService("AddData", new object[] { options }));
|
}
|
|
/// <summary>
|
/// 添加数据
|
/// </summary>
|
/// <param name="options">保存模型参数</param>
|
/// <returns>操作结果</returns>
|
[HttpPost, Route("Add")]
|
public virtual ActionResult Add([FromBody] SaveModel options)
|
{
|
return Json(InvokeService("AddData", new object[] { options }));
|
}
|
|
/// <summary>
|
/// 更新数据
|
/// </summary>
|
/// <param name="options">包含更新数据的模型</param>
|
/// <returns>操作结果</returns>
|
[HttpPost, Route("Update")]
|
public virtual ActionResult Update([FromBody] SaveModel options)
|
{
|
return Json(InvokeService("UpdateData", new object[] { options }));
|
}
|
|
/// <summary>
|
/// 更新数据
|
/// </summary>
|
/// <param name="options">要更新的实体数据</param>
|
/// <returns>操作结果</returns>
|
[HttpPost, Route("UpdateData")]
|
public virtual ActionResult UpdateData([FromBody] TEntity options)
|
{
|
return Json(InvokeService("UpdateData", new object[] { options }));
|
}
|
|
/// <summary>
|
/// 处理删除数据的HTTP POST请求
|
/// </summary>
|
/// <param name="key">要删除的数据主键数组</param>
|
/// <returns>返回删除操作的JSON格式结果</returns>
|
/// <remarks>
|
/// 该方法是虚拟方法,可通过路由"Del"访问,调用服务层的DeleteData方法执行实际删除操作
|
/// </remarks>
|
[HttpPost, Route("Del")]
|
public virtual ActionResult Del([FromBody] object[] key)
|
{
|
return Json(InvokeService("DeleteData", new object[] { key }));
|
}
|
|
/// <summary>
|
/// 导出数据接口
|
/// </summary>
|
/// <param name="loadData">分页数据选项</param>
|
/// <returns>
|
/// 成功时返回文件下载,失败时返回JSON格式的响应内容
|
/// </returns>
|
/// <remarks>
|
/// 调用服务层"Export"方法处理导出请求,根据返回结果生成文件下载或错误响应
|
/// </remarks>
|
[HttpPost, Route("Export")]
|
public virtual ActionResult Export([FromBody] PageDataOptions loadData)
|
{
|
WebResponseContent result = InvokeService("Export", new object[] { loadData }) as WebResponseContent;
|
if (result.Status)
|
return File(
|
System.IO.File.ReadAllBytes(result.Data.ToString()),
|
System.Net.Mime.MediaTypeNames.Application.Octet,
|
Path.GetFileName(result.Data.ToString())
|
);
|
return Json(result);
|
}
|
|
/// <summary>
|
/// 下载模板文件
|
/// </summary>
|
/// <returns>返回文件流或JSON结果</returns>
|
/// <remarks>
|
/// 支持POST和GET请求。当操作成功时返回文件流下载,失败时返回包含错误信息的JSON响应。
|
/// </remarks>
|
[HttpPost, HttpGet, Route("DownLoadTemplate")]
|
public virtual ActionResult DownLoadTemplate()
|
{
|
WebResponseContent result = InvokeService("DownLoadTemplate", new object[] { }) as WebResponseContent;
|
if (result.Status)
|
return File(
|
System.IO.File.ReadAllBytes(result.Data.ToString()),
|
System.Net.Mime.MediaTypeNames.Application.Octet,
|
Path.GetFileName(result.Data.ToString())
|
);
|
return Json(result);
|
}
|
|
/// <summary>
|
/// 导入文件数据
|
/// </summary>
|
/// <param name="fileInput">上传的文件列表</param>
|
/// <returns>导入操作结果</returns>
|
[HttpPost, Route("Import")]
|
public virtual ActionResult Import(List<IFormFile> fileInput)
|
{
|
return Json(InvokeService("Import", new object[] { fileInput }));
|
}
|
|
/// <summary>
|
/// 导出种子数据API接口
|
/// </summary>
|
/// <returns>返回种子数据导出结果</returns>
|
/// <remarks>该接口允许匿名访问</remarks>
|
[HttpPost, Route("ExportSeedData"), AllowAnonymous]
|
public ActionResult ExportSeedData()
|
{
|
return Json(InvokeService("ExportSeedData", new object[] { }));
|
}
|
|
/// <summary>
|
/// 调用服务方法
|
/// </summary>
|
/// <param name="methodName">要调用的方法名称</param>
|
/// <param name="parameters">方法参数数组</param>
|
/// <returns>调用方法的返回结果</returns>
|
/// <remarks>
|
/// 通过反射动态调用Service对象中的指定方法
|
/// </remarks>
|
private object InvokeService(string methodName, object[] parameters)
|
{
|
Type t = Service.GetType();
|
List<Type> types = new List<Type>();
|
foreach (var param in parameters)
|
{
|
types.Add(param.GetType());
|
}
|
MethodInfo method = t.GetMethod(methodName, types.ToArray());
|
return method.Invoke(Service, parameters);
|
}
|
}
|
}
|