概述
为什么要写这篇文章呢,因为我们现在开发的应用当中,最最重要的应该要算是 WebApi 了吧,大部分的应用都需要前后端分离,比如 app,小程序,h5 等开发,都需要前端同学和后端同学共同配合开发来完成项目。
那么 NCF 这么优秀的框架自然也不会少了 webapi 的实现。
如果没有看过前三篇的同学,可以根据下面步骤直接进入 webapi 的实战,如果看过前面三篇的同学,看到自己熟悉的步骤,可以直接跳过
拉取 NCF 仓库 Developer 分支
首先我们得知道 NCF 的仓库在什么地方,推荐大家 Star
NCF 仓库地址:https://github.com/NeuCharFramework/NCF
NCF 依赖库仓库地址:https://github.com/NeuCharFramework/NcfPackageSources
NCF 开发文档仓库地址:https://gitee.com/NeuCharFramework/NcfDocs
找到仓库,使用 git 工具拉取到本地后,直接使用宇宙第一 IDE(Visual Studio)打开项目,如图所示
修改数据库连接字符串
找到 Senparc.Web 项目下面的 SenparcConfig.config
打开文件,修改连接字符串
修改完连接字符串以后,就可以直接运行咯,见证奇迹的时候到来了
运行 Senparc.Web 项目,初始化基础数据库
点击立即安装,可以看到出现了登录的页面,保存好这个账号密码,以便后续使用
登录后台进入模块管理界面
点击登录,并输入账号密码,进入后台管理
安装模块生成器模块
点击模块管理进入
如果在这里未发现模块生成器,则双击 Senparc.Web,进入文件编辑,增加 XncfBuilder
然后重新编译,即可看到模块生成器
安装本地的 Xncf Module Template
首先检查一下本地是否安装了 Xncf Module Template
进入 cmd 或 powershell,输入一下命令
看下是否会有图中所示内容
如果有就跳过此步骤,如果没有则执行以下命令
dotnet new --install Senparc.Xncf.XncfBuilder.Template::0.1.19
复制代码
安装完成后效果如上图所示
使用模块生成器生成你想生成的任意的模块
安装模块生成器后,点击开启
点击执行生成模块
弹出生成需要的条件参数
执行后,则生成了项目中的
然后把生成的模块及 Senparc.Xncf.Swagger 模块,加入到 Senparc.Web 的引用中
在模块管理中,则可以看到 2 个引入的模块
生成数据库所需要的表
安装 WorkShop.Xncf.WebApiDemo01 模块,并开启,则能看到如下图所示
同时数据库中就已经生成了
进入演示完全分离的前后端及 WebApi
在 Senparc.Web/wwwroot/下面,我放了一个 demo 的文件夹
如果你的访问首页地址为:https://localhost:44311/
则访问 demo 的地址为:https://localhost:44311/demo/index.html
以上就是 WebApi 的 Demo
在 Senparc.Web 中引用 Senparc.Xncf.Swagger 项目(此项目默认加载即可)
双击 Senparc.Web 进入文件编辑
引入项目
<ProjectReference Include="..\Senparc.Xncf.Swagger\Senparc.Xncf.Swagger.csproj" />
复制代码
在 WorkShop.Xncf.WebApiDemo01 项目下建立 Controller 目录
在 Controller 下面建立 BaseController 用来统一处理返回的内容方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.VO;
using WorkShop.Xncf.WebApiDemo01.Services;
using Senparc.Ncf.Core.Cache;
namespace WorkShop.Xncf.WebApiDemo01.Controllers
{
public class BaseController : ControllerBase
{
public IActionResult Success(object data)
{
var response = new BaseResult<object>(200, "请求成功", data);
return Ok(response);
}
public IActionResult Fail(object data)
{
var response = new BaseResult<object>(201, "请求失败", data);
return Ok(response);
}
}
}
复制代码
在 Models 下面建立 BaseResult 来处理统一返回的数据格式
using Senparc.CO2NET.Helpers;
using System;
using System.Collections.Generic;
using System.Text;
namespace WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.VO
{
public class BaseResult<T>
{
public BaseResult(int code,string msg,T data)
{
Code = code;
Msg = msg;
Data = data;
RequestTime = $"{ string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now)}";
}
/// <summary>
/// 错误码,200 表示成功
/// </summary>
public int Code { get; set; } = 0;
/// <summary>
/// 消息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 主体数据
/// </summary>
public T Data { get; set; }
/// <summary>
/// 请求时间
/// </summary>
public string RequestTime { get; set; }
}
}
复制代码
新建 ColorController,并创建具体的使用方法
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Senparc.Ncf.Core.Cache;
using Senparc.CO2NET.Cache;
using Senparc.CO2NET.Cache.CsRedis;
using WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.VO;
using WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.Config;
using WorkShop.Xncf.WebApiDemo01.Utils;
using WorkShop.Xncf.WebApiDemo01.Services;
using WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.Dto;
namespace WorkShop.Xncf.WebApiDemo01.Controllers
{
/// <summary>
/// 文件上传接口
/// </summary>
[Route("api/v{version:apiVersion}/[controller]/[action]")]
[ApiController]
[ApiVersion("1")]
public class ColorController : BaseController
{
private readonly ColorService colorService;
public ColorController(ColorService colorService)
{
this.colorService = colorService;
}
/// <summary>
/// 获取当前颜色
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> GetColorAsync()
{
try
{
var response = await colorService.ApiGetColorAsync();
return Success(response);
}
catch (Exception ex)
{
return Fail(ex.Message);
}
}
/// <summary>
/// 设置颜色
/// </summary>
/// <param name="type">类型(1-变亮;2-变暗;3-随机;)</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> SetColorAsync(int type)
{
try
{
var response = await colorService.ApiSetColorAsync(type);
return Success(response);
}
catch (Exception ex)
{
return Fail(ex.Message);
}
}
}
}
复制代码
在 ColorService 里面增加 Api 调用的方法
using Senparc.Ncf.Core.Enums;
using Senparc.Ncf.Repository;
using Senparc.Ncf.Service;
using WorkShop.Xncf.WebApiDemo01.Models.DatabaseModel.Dto;
using System;
using System.Threading.Tasks;
namespace WorkShop.Xncf.WebApiDemo01.Services
{
public class ColorService : ServiceBase<Color>
{
public ColorService(IRepositoryBase<Color> repo, IServiceProvider serviceProvider)
: base(repo, serviceProvider)
{
}
public async Task<ColorDto> CreateNewColor()
{
Color color = new Color(-1, -1, -1);
await base.SaveObjectAsync(color).ConfigureAwait(false);
ColorDto colorDto = base.Mapper.Map<ColorDto>(color);
return colorDto;
}
public async Task<ColorDto> Brighten()
{
//TODO:异步方法需要添加排序功能
var obj = this.GetObject(z => true, z => z.Id, OrderingType.Descending);
obj.Brighten();
await base.SaveObjectAsync(obj).ConfigureAwait(false);
return base.Mapper.Map<ColorDto>(obj);
}
public async Task<ColorDto> Darken()
{
//TODO:异步方法需要添加排序功能
var obj = this.GetObject(z => true, z => z.Id, OrderingType.Descending);
obj.Darken();
await base.SaveObjectAsync(obj).ConfigureAwait(false);
return base.Mapper.Map<ColorDto>(obj);
}
public async Task<ColorDto> Random()
{
//TODO:异步方法需要添加排序功能
var obj = this.GetObject(z => true, z => z.Id, OrderingType.Descending);
obj.Random();
await base.SaveObjectAsync(obj).ConfigureAwait(false);
return base.Mapper.Map<ColorDto>(obj);
}
//TODO: 更多业务方法可以写到这里
#region 接口要请求的方法
public async Task<ColorDto> ApiSetColorAsync(int type)
{
ColorDto dto;
switch (type)
{
case 1:
{
dto = await Brighten();
break;
}
case 2:
{
dto = await Darken();
break;
}
default:
{
dto = await Random();
break;
}
}
return dto;
}
public async Task<object> ApiGetColorAsync()
{
var obj = this.GetObject(z => true, z => z.Id, OrderingType.Descending);
return obj;
}
#endregion
}
}
复制代码
运行测试结果
https://localhost:44311/senparc-api-docs/index.html
评论