Skip to content

服务端开发

我们用一个简单的业务做例子:通知公告管理

1、创建模型和表

db-first更擅长解决在开发过程中需求经常变化的问题,所以推荐使用db-first模式开发。那么第一件事就是设计数据库。项目使用了PowerDesigner设计数据模型,方便直观,也便于后期维护。在pdm模型中设计好表之后,生成脚本,在数据库中执行如图 data-model 详情请参照relationship-model里的er模型图,建议使用物理外键,具体那些需要物理外键可根据项目自行斟酌

2、新建实体类

这里可以使用工具生成器,或者手动编写,这里以手动编写为例,我们在PurestAdmin.SqlSugar项目的Entity文件夹下新建实体类如下:

Csharp
/// <summary>
/// 通知公告表
/// </summary>
[SugarTable("PUREST_NOTICE")]
public partial class NoticeEntity : BaseEntity
{
    /// <summary>
    /// 标题
    /// </summary>
    [SugarColumn(ColumnName = "TITLE")]
    public string Title { get; set; }
    /// <summary>
    /// 内容
    /// </summary>
    [SugarColumn(ColumnName = "CONTENT")]
    public string Content { get; set; }
    /// <summary>
    /// 类型
    /// </summary>
    [SugarColumn(ColumnName = "NOTICE_TYPE")]
    public long NoticeType { get; set; }
    /// <summary>
    /// 级别
    /// </summary>
    [SugarColumn(ColumnName = "LEVEL")]
    public long Level { get; set; }
}

这里我门使用了partial部分类关键字,如果有需要,可以在 Entity` 文件夹下还有一部分,这里的规则就是Entity文件夹内的类和数据库里的字段是一一对应的!

3、完成功能所需的接口

由于我们的接口都是动态生成,这样我们直接在Application里实现业务了,这里有两种方式实现,可酌情选择

直接使用PurestAdmin.Application层

这样的好处就是直接上来就可以撸你的业务了。不好的地方就是和此开源项目自身的东西掺杂在一起。自行斟酌选用。

  • 代码结构 api

里面包含了curd的基本操作,这里不做赘述

接口生成规则

参照:自动API控制器

关于对象映射

项目使用Mapster对象映射库,PurestAdmin.Application已经自动注册,可直接使用.adapt方法,或者实现IRegister接口

  • 直接使用
C#
/// <summary>
/// 添加
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<long> AddAsync(AddNoticeInput input)
{
    var entity = input.Adapt<NoticeEntity>();
    return await _db.Insertable(entity).ExecuteReturnSnowflakeIdAsync();
}
  • 使用IRegister

由于Notice没有使用这种方法,我们以UserServices接口里的mapper为例

C#
/// <summary>
/// 新增用户映射
/// </summary>
public class AddUserInputToEntity : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        _ = config.ForType<AddUserInput, UserEntity>()
            .IgnoreNullValues(true)
            .Map(dest => dest.Account, src => src.Account.ToLower())
            .Map(dest => dest.Password, src => MD5Encryption.Encrypt(src.Password, false, false));
    }
}

新建一个 "Application层" 作为业务层

比如起一个名字叫做PurestAdmin.Application.ABC,在这个项目里,我们需要根据Abp的模块化规则,新建一个文件,代码如下

c#
[DependsOn(typeof(SqlSugarModule),
    typeof(AdminMultiplexModule))]
public class AdminAppModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context.Services.AddMapsterIRegister(Assembly.GetExecutingAssembly());
        //Configure<AbpAspNetCoreMvcOptions>(options =>
        //{
        //    options.ConventionalControllers.Create(typeof(AdminAppModule).Assembly, opts =>
        //    {
        //        opts.RootPath = "v1";
        //        opts.UrlActionNameNormalizer = (action) =>
        //        {
        //            return action.ActionNameInUrl;
        //        };
        //    });
        //});
        //base.ConfigureServices(context);
    }
}

这里面就是自动注入对象映射,如果你需要自定义路由生成规则,也可以在这里进行定义(注释部分),需要在api.host项目里引用你的application层,参照

host

4、配置功能编码

运行项目,打开功能管理,添加数据 function添加好功能后,将功能赋给角色,重新登陆即可

LGPL-3.0 License.