服务端开发
我们用一个简单的业务做例子:通知公告管理
1、创建模型和表
db-first更擅长解决在开发过程中需求经常变化的问题,所以推荐使用db-first模式开发。那么第一件事就是设计数据库。项目使用了PowerDesigner设计数据模型,方便直观,也便于后期维护。在pdm模型中设计好表之后,生成脚本,在数据库中执行如图 详情请参照relationship-model里的er模型图,建议使用物理外键,具体那些需要物理外键可根据项目自行斟酌
2、新建实体类
这里可以使用工具生成器,或者手动编写,这里以手动编写为例,我们在PurestAdmin.SqlSugar项目的Entity文件夹下新建实体类如下:
/// <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层
这样的好处就是直接上来就可以撸你的业务了。不好的地方就是和此开源项目自身的东西掺杂在一起。自行斟酌选用。
- 代码结构
里面包含了curd的基本操作,这里不做赘述
接口生成规则
参照:自动API控制器
关于对象映射
项目使用Mapster对象映射库,PurestAdmin.Application已经自动注册,可直接使用.adapt方法,或者实现IRegister接口
- 直接使用
/// <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为例
/// <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的模块化规则,新建一个文件,代码如下
[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层,参照
4、配置功能编码
运行项目,打开功能管理,添加数据 添加好功能后,将功能赋给角色,重新登陆即可