如何编写后台API接口? #
通过官方示例脚手架,示例项目已经有例子,
首先在program中启动webapi。
//预加载配置
builder.WebHost.UseMicroService();
// 注入服务
builder.Services.AddMicroService(builder.Configuration, true);
//注入微服务
app.UseMicroService(builder.Configuration);
在Service项目中定义接口
/// <summary>
/// Demo服务
/// </summary>
[ApiDescriptionSettings(Tag = "Demo服务",Name = "ExchangeRate", Order = 200)]
[Route("api/Demo/[controller]")]
public class ExchangeRateService : IExchangeRateService, IDynamicApiController, ITransient, ICapSubscribe
{
private readonly ISqlSugarRepository<ExchangeRateEntity> _exchangeRateRepository;
private readonly ISqlSugarRepository<DbLinkEntity> _dbLinkrepository;
private readonly IDbLinkService _dbLinkService;
private readonly IDataBaseService _dataBaseService;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
private readonly ILogger<ExchangeRateService> _logger; //elk可以使用微软的ILogger,已经过滤掉nacos的请求了
private readonly ICapPublisher _capBus;
private readonly IExchangeRateApi _exchangeRateApi;
private readonly IOmsApi _omsApi;
private readonly ISendService _sendService;
/// <summary>
/// 初始化一个<see cref="ExchangeRateService"/>类型的新实例
/// </summary>
public ExchangeRateService(
ISqlSugarRepository<ExchangeRateEntity> exchangeRateRepository,
IDbLinkService dbLinkService,
IDataBaseService dataBaseService,
IUserManager userManager,
ICapPublisher capBus,
ISqlSugarRepository<DbLinkEntity> dbLinkrepository,
IExchangeRateApi exchangeRateApi,
IOmsApi omsApi,
ILoggerFactory loggerFactory,
ILogger<ExchangeRateService> logger,
ISendService sendService)
{
_exchangeRateRepository = exchangeRateRepository;
_db = _exchangeRateRepository.Context;
_dbLinkService = dbLinkService;
_dataBaseService = dataBaseService;
_userManager = userManager;
_dbLinkrepository = dbLinkrepository;
_logger = logger;
_capBus = capBus;
_exchangeRateApi = exchangeRateApi;
_omsApi = omsApi;
_sendService = sendService;
}
/// <summary>
/// 获取Demo
/// </summary>
/// <param name="id">参数</param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<dynamic> GetInfo(string id)
{
//下面注释的是代码生成的,可以不用写了,直接可以识别所在租户
/*var dbLink = await _dbLinkService.GetInfoByDbName("mall3s_demo");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);*/
//elk日志写法之一,相当于string.format("日志:{0}","日志1")
_logger.LogInformation("获取Demo,id:{0}", id);
var entity = await _db.Queryable<ExchangeRateEntity>().FirstAsync(p => p.Id == id);
var output = entity.Adapt<ExchangeRateInfoOutput>();
return output;
}
/// <summary>
/// 获取Demo列表
/// </summary>
/// <param name="input">请求参数</param>
/// <returns></returns>
[HttpGet("")]
public async Task<dynamic> GetList([FromQuery] ExchangeRateListQueryInput input)
{
_logger.LogInformation("获取Demo列表,参数:{0}", input.ToJson());
var sidx = input.sidx == null ? "id" : input.sidx;
List<string> queryExchangeDate = input.exchangeDate != null ? input.exchangeDate.Split(',').ToObeject<List<string>>() : null;
DateTime? startExchangeDate = queryExchangeDate != null ? Ext.GetDateTime(queryExchangeDate.First()) : null;
DateTime? endExchangeDate = queryExchangeDate != null ? Ext.GetDateTime(queryExchangeDate.Last()) : null;
var data = await _db.Queryable<ExchangeRateEntity>()
.WhereIF(queryExchangeDate != null, p => p.ExchangeDate >= new DateTime(startExchangeDate.ToDate().Year, startExchangeDate.ToDate().Month, startExchangeDate.ToDate().Day, 0, 0, 0))
.WhereIF(queryExchangeDate != null, p => p.ExchangeDate <= new DateTime(endExchangeDate.ToDate().Year, endExchangeDate.ToDate().Month, endExchangeDate.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.from), p => p.From.Contains(input.from))
.WhereIF(!string.IsNullOrEmpty(input.to), p => p.To.Contains(input.to))
.Select(it=> new ExchangeRateListOutput
{
id = it.Id,
exchangeDate=it.ExchangeDate,
from=it.From,
to=it.To,
rate=it.Rate,
}).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<ExchangeRateListOutput>.SqlSugarPageResult(data);
}
/// <summary>
/// 新建Demo
/// </summary>
/// <param name="input">参数</param>
/// <returns></returns>
[HttpPost("")]
public async Task Create([FromBody] ExchangeRateCrInput input)
{
_logger.LogInformation("新建Demo,参数:{0}", input.ToJson());
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt<ExchangeRateEntity>();
entity.Creator();
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw Mall3sException.Oh(ErrorCode.COM1000);
}
/// <summary>
/// 获取Demo无分页列表
/// </summary>
/// <param name="input">请求参数</param>
/// <returns></returns>
[NonAction]
public async Task<dynamic> GetNoPagingList([FromQuery] ExchangeRateListQueryInput input)
{
_logger.LogInformation("获取Demo无分页列表,参数:{0}", input.ToJson());
var sidx = input.sidx == null ? "id" : input.sidx;
List<string> queryExchangeDate = input.exchangeDate != null ? input.exchangeDate.Split(',').ToObeject<List<string>>() : null;
DateTime? startExchangeDate = queryExchangeDate != null ? Ext.GetDateTime(queryExchangeDate.First()) : null;
DateTime? endExchangeDate = queryExchangeDate != null ? Ext.GetDateTime(queryExchangeDate.Last()) : null;
var data = await _db.Queryable<ExchangeRateEntity>()
.WhereIF(queryExchangeDate != null, p => p.ExchangeDate >= new DateTime(startExchangeDate.ToDate().Year, startExchangeDate.ToDate().Month, startExchangeDate.ToDate().Day, 0, 0, 0))
.WhereIF(queryExchangeDate != null, p => p.ExchangeDate <= new DateTime(endExchangeDate.ToDate().Year, endExchangeDate.ToDate().Month, endExchangeDate.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.from), p => p.From.Contains(input.from))
.WhereIF(!string.IsNullOrEmpty(input.to), p => p.To.Contains(input.to))
.Select(it=> new ExchangeRateListOutput
{
id = it.Id,
exchangeDate=it.ExchangeDate,
from=it.From,
to=it.To,
rate=it.Rate,
}).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
return data;
}
....
}
启动项目。