z8018
2 天以前 d8dc91f9c1fece5711e38edd1b1274cb9e579015
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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);
        }
    }
}