원클릭으로
admin-net-backend
Admin.NET 是基于 .NET8/10 (Furion/SqlSugar) 实现的通用权限开发框架后端,提供多租户、RBAC 鉴权、动态 API、缓存、任务调度、代码生成、文件管理、微信对接等企业级功能,支持插件式扩展。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Admin.NET 是基于 .NET8/10 (Furion/SqlSugar) 实现的通用权限开发框架后端,提供多租户、RBAC 鉴权、动态 API、缓存、任务调度、代码生成、文件管理、微信对接等企业级功能,支持插件式扩展。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | Admin.NET-backend |
| description | Admin.NET 是基于 .NET8/10 (Furion/SqlSugar) 实现的通用权限开发框架后端,提供多租户、RBAC 鉴权、动态 API、缓存、任务调度、代码生成、文件管理、微信对接等企业级功能,支持插件式扩展。 |
| tags | ["dotnet","webapi","rbac","multitenant","furion","sqlsugar"] |
项目地址: https://github.com/znlgis/Admin.NET
后端代码目录:
Admin.NET/(.NET 解决方案)在线文档: https://adminnet.top/
演示环境: https://demo.adminnet.top(账号:superAdmin.NET / 密码:Admin.NET++010101)
许可证: MIT + Apache 2.0
Admin.NET 后端基于 .NET 8 / .NET 10 构建,核心依赖 Furion 框架(动态 API、依赖注入、事件总线、远程请求等)和 SqlSugar ORM(自动建库建表、多租户、多数据库支持)。框架采用分层架构 + 插件式开发,适用于中小企业快速搭建权限管理系统。
核心技术栈:
Admin.NET/ # 后端解决方案根目录
├── Admin.NET.sln # Visual Studio 解决方案文件
├── Admin.NET.Core/ # 核心框架层
│ ├── Attribute/ # 自定义特性
│ ├── Cache/ # 缓存工具
│ ├── Const/ # 常量定义
│ ├── Entity/ # 核心实体(EntityBase 等基类)
│ ├── Enum/ # 枚举定义
│ ├── EventBus/ # 事件总线
│ ├── Extension/ # 扩展方法
│ ├── Hub/ # SignalR Hub
│ ├── Job/ # 定时任务
│ ├── Logging/ # 日志组件
│ ├── Option/ # 配置选项类
│ ├── SeedData/ # 种子数据
│ ├── Service/ # 核心服务(见下方服务模块表)
│ ├── SignalR/ # SignalR 配置
│ ├── SignatureAuth/ # 签名认证
│ ├── SqlSugar/ # SqlSugar 配置与仓储
│ ├── ElasticSearch/ # ES 日志集成
│ ├── Update/ # 数据库更新脚本
│ └── Utils/ # 工具类
├── Admin.NET.Application/ # 应用层(业务示例)
│ ├── Configuration/ # 应用配置
│ ├── Const/ # 应用常量
│ ├── Entity/ # 业务实体
│ ├── EventBus/ # 业务事件
│ ├── OpenApi/ # 开放 API
│ ├── Startup.cs # 应用层启动配置
│ └── GlobalUsings.cs # 全局 using
├── Admin.NET.Web.Core/ # Web 中间件与配置
├── Admin.NET.Web.Entry/ # 启动入口
│ ├── Controllers/ # 控制器
│ ├── appsettings.json # 配置文件
│ └── wwwroot/ # 静态资源
├── Admin.NET.Test/ # 单元测试
└── Plugins/ # 插件目录
├── Admin.NET.Plugin.GoView/ # GoView 数据大屏
├── Admin.NET.Plugin.DingTalk/ # 钉钉集成
├── Admin.NET.Plugin.ApprovalFlow/ # 审批流程
├── Admin.NET.Plugin.K3Cloud/ # 金蝶 K3 Cloud
├── Admin.NET.Plugin.ReZero/ # ReZero 零代码
└── Admin.NET.Plugin.WorkWeixin/ # 企业微信
cd Admin.NET
dotnet restore Admin.NET.sln
dotnet run --project Admin.NET.Web.Entry
启动后默认访问 https://localhost:5005,Swagger 文档地址:https://localhost:5005/api
主配置文件为 Admin.NET.Web.Entry/appsettings.json,关键配置节点:
{
"DbConnection": {
"DbType": "Sqlite",
"ConnectionString": "DataSource=./admin.net.db"
},
"Cache": {
"CacheType": "Memory"
},
"JWTSettings": {
"ValidateIssuerSigningKey": true,
"IssuerSigningKey": "your-secret-key",
"ValidIssuer": "Admin.NET",
"ValidAudience": "Admin.NET",
"ExpiredTime": 120
}
}
Admin.NET.Core/Service/ 目录下按业务领域划分服务模块:
| 服务目录 | 说明 | 关键类 |
|---|---|---|
Auth/ | 登录认证、Token 管理 | SysAuthService |
User/ | 用户管理 | SysUserService |
Role/ | 角色管理、权限分配 | SysRoleService |
Org/ | 机构 / 组织架构管理 | SysOrgService |
Menu/ | 菜单与按钮权限管理 | SysMenuService |
Pos/ | 职位管理 | SysPosService |
Dict/ | 数据字典管理 | SysDictTypeService / SysDictDataService |
Config/ | 系统参数配置 | SysConfigService |
Tenant/ | 多租户管理 | SysTenantService |
Log/ | 访问日志 / 操作日志 | SysLogVisService / SysLogOpService |
File/ | 文件上传下载管理 | SysFileService |
Job/ | 任务调度管理 | SysJobService |
Notice/ | 通知公告(SignalR 推送) | SysNoticeService |
OnlineUser/ | 在线用户管理(SignalR) | SysOnlineUserService |
Message/ | 站内消息 | SysMessageService |
CodeGen/ | 代码生成器 | SysCodeGenService |
Cache/ | 缓存管理 | SysCacheService |
Server/ | 服务器监控 | SysServerService |
DataBase/ | 数据库管理 | SysDatabaseService |
Wechat/ | 微信小程序 / 支付 | SysWechatService |
Alipay/ | 支付宝支付 | SysAlipayService |
OAuth/ | 第三方 OAuth 登录 | SysOAuthService |
OpenAccess/ | 开放接口签名认证 | SysOpenAccessService |
Print/ | 打印模板管理 | SysPrintService |
Region/ | 行政区域 | SysRegionService |
APIJSON/ | APIJSON 协议支持 | ApiJsonService |
Lang/ | 多语言管理 | SysLangService |
Template/ | 模板管理 | SysTemplateService |
Plugin/ | 插件管理 | SysPluginService |
Enum/ | 枚举查询服务 | SysEnumService |
Const/ | 常量查询服务 | SysConstService |
Common/ | 通用服务 | CommonService |
Schedule/ | 计划任务管理 | - |
所有业务实体继承自 EntityBase 或其变体:
/// 实体基类 - 含主键 Id
[SugarTable(null)]
public abstract class EntityBase
{
[SugarColumn(ColumnDescription = "主键Id", IsPrimaryKey = true, IsIdentity = false)]
public virtual long Id { get; set; }
}
/// 带审计字段的实体基类
public abstract class EntityBaseData : EntityBase
{
public virtual long? CreateUserId { get; set; }
public virtual DateTime? CreateTime { get; set; }
public virtual long? UpdateUserId { get; set; }
public virtual DateTime? UpdateTime { get; set; }
public virtual bool IsDelete { get; set; } // 软删除
}
/// 带租户的实体基类
public abstract class EntityTenant : EntityBaseData
{
public virtual long? TenantId { get; set; }
}
// BaseService<T> 自动提供 GetDetail / GetList / Add / Update / Delete 接口
[ApiDescriptionSettings(Order = 100)]
public class MyBusinessService : BaseService<MyEntity>
{
public MyBusinessService(SqlSugarRepository<MyEntity> rep) : base(rep) { }
}
/// <summary>
/// 自定义业务服务 🏷️
/// </summary>
[ApiDescriptionSettings(Order = 200)]
public class MyCustomService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<MyEntity> _rep;
public MyCustomService(SqlSugarRepository<MyEntity> rep)
{
_rep = rep;
}
/// <summary>
/// 分页查询 🔖
/// </summary>
[DisplayName("分页查询")]
public async Task<SqlSugarPagedList<MyEntityOutput>> Page(MyEntityInput input)
{
return await _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
.OrderBy(u => u.CreateTime, OrderByType.Desc)
.Select<MyEntityOutput>()
.ToPagedListAsync(input.Page, input.PageSize);
}
/// <summary>
/// 新增 🔖
/// </summary>
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("新增")]
public async Task<long> Add(AddMyEntityInput input)
{
var entity = input.Adapt<MyEntity>();
await _rep.InsertAsync(entity);
return entity.Id;
}
/// <summary>
/// 更新 🔖
/// </summary>
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新")]
public async Task Update(UpdateMyEntityInput input)
{
var entity = input.Adapt<MyEntity>();
await _rep.AsUpdateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
}
/// <summary>
/// 删除 🔖
/// </summary>
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除")]
public async Task Delete(DeleteMyEntityInput input)
{
await _rep.FakeDeleteAsync(input.Adapt<MyEntity>()); // 软删除
}
}
public class MyEntityInput : BasePageInput
{
public string? Name { get; set; }
}
public class AddMyEntityInput
{
[Required(ErrorMessage = "名称不能为空")]
public string Name { get; set; }
public string? Remark { get; set; }
}
public class UpdateMyEntityInput : AddMyEntityInput
{
[Required(ErrorMessage = "Id不能为空")]
public long Id { get; set; }
}
public class DeleteMyEntityInput
{
[Required(ErrorMessage = "Id不能为空")]
public long Id { get; set; }
}
public class MyEntityOutput
{
public long Id { get; set; }
public string Name { get; set; }
public string? Remark { get; set; }
public DateTime? CreateTime { get; set; }
}
实现 IDynamicApiController 接口即自动暴露为 API,方法名约定映射 HTTP 动词:
| 方法名前缀 | HTTP 动词 | 示例 |
|---|---|---|
Get / Find / Fetch / Query | GET | GetDetail(long id) |
Post / Add / Create / Insert | POST | Add(AddInput input) |
Put / Update | PUT | Update(UpdateInput input) |
Delete / Remove / Clear | DELETE | Delete(long id) |
Page | POST(分页) | Page(PageInput input) |
可通过 [HttpPost] / [HttpGet] 强制覆盖,通过 [ApiDescriptionSettings(Name = "xxx")] 自定义路由段。
// 注入仓储
private readonly SqlSugarRepository<TEntity> _rep;
// 常用操作
await _rep.InsertAsync(entity); // 新增
await _rep.AsUpdateable(entity).IgnoreColumns(true)
.ExecuteCommandAsync(); // 更新(忽略空列)
await _rep.FakeDeleteAsync(entity); // 软删除
await _rep.DeleteByIdAsync(id); // 物理删除
await _rep.GetByIdAsync(id); // 按 ID 查
await _rep.GetListAsync(); // 查全部
await _rep.AsQueryable() // 条件查询
.WhereIF(condition, u => u.Field == value)
.OrderBy(u => u.CreateTime, OrderByType.Desc)
.Select<OutputDto>()
.ToPagedListAsync(page, pageSize); // 分页
// 切换数据库上下文(多租户)
_rep.Context.AsTenant().GetConnection(tenantDbConfigId);
// 瞬态(每次请求新实例)
public class MyService : ITransient { }
// 作用域(每次请求共享)
public class MyService : IScoped { }
// 单例
public class MyService : ISingleton { }
// 发布事件
await _eventPublisher.PublishAsync(new ChannelEventSource("MyEvent:Handler", eventData));
// 订阅处理
[EventSubscribe("MyEvent:Handler")]
public async Task HandleMyEvent(EventHandlerExecutingContext context)
{
var data = context.Source.Payload;
// 处理逻辑
}
// 注入缓存
private readonly SysCacheService _cache;
// 读写缓存
await _cache.SetAsync(key, value);
var result = await _cache.GetAsync<T>(key);
await _cache.RemoveAsync(key);
POST /api/sysAuth/login
Content-Type: application/json
{
"account": "admin",
"password": "加密后的密码"
}
返回:{ "accessToken": "...", "refreshToken": "..." }
Authorization: Bearer {accessToken}
sysUser:add)做细粒度控制// 上传文件
POST /api/sysFile/uploadFile
Content-Type: multipart/form-data
// 文件存储支持:
// - Local(本地存储)
// - Aliyun(阿里云 OSS)
// - Tencent(腾讯云 COS)
// - Minio
// - QiNiu(七牛云)
代码生成器根据数据库表结构自动生成前后端代码:
新建类库项目引用 Admin.NET.Core,在 Plugins/ 目录下组织:
// 1. 新建项目 Admin.NET.Plugin.MyPlugin
// 2. 引用 Admin.NET.Core
// 3. 实现服务
[ApiDescriptionSettings("MyPlugin", Order = 100)]
public class MyPluginService : IDynamicApiController, ITransient
{
// 业务代码
}
// 4. 在 Admin.NET.Web.Entry 中引用该插件项目即可自动注册
| 功能 | NuGet 包 | 用途 |
|---|---|---|
| 微信小程序/支付 | SKIT.FlurlHttpClient.Wechat.* | 微信 API 对接 |
| 支付宝支付 | AlipaySDKNet.Standard | 支付宝 API 对接 |
| 导入导出 | Magicodes.IE.Excel / MiniExcel | Excel/Word/PDF 导入导出 |
| 二维码 | QRCoder | 二维码生成 |
| 国密算法 | BouncyCastle.Cryptography | SM2/SM3/SM4 加密 |
| LDAP | Novell.Directory.Ldap.NETStandard | LDAP/AD 域认证 |
| 短信 | AlibabaCloud.SDK.Dysmsapi20170525 | 阿里云短信 |
| 邮件 | MailKit / NETCore.MailKit | 邮件发送 |
| IP 定位 | IPTools.China / IPTools.International | IP 地址解析 |
| 限流 | AspNetCoreRateLimit | API 访问限流 |
| ES 日志 | Elastic.Clients.Elasticsearch | Elasticsearch 日志 |
| OAuth | AspNet.Security.OAuth.* | 第三方登录(微信/Gitee) |
1. 建议每个业务系统单独创建一个工程(参考 Admin.NET.Application 层的结构)
2. 自建应用层引用 Admin.NET.Core 层(不修改核心工程名)
3. Admin.NET.Web.Entry 引用新建的应用层工程
4. 接口 / 服务 / 控制器采用合并模式,不影响自建应用层的使用
5. 可随主仓库升级而升级,避免冲突
dotnet run → 自动建库建表 + 种子数据Admin.NET.Application 结构,新建实体 → 新建 Service(继承 BaseService<T> 或实现 IDynamicApiController)→ 新建 DTOPlugins/ 下新建类库 → 引用 Admin.NET.Core → 实现 IDynamicApiController → 被主项目引用即自动注册appsettings.json(数据库/Redis/JWT)→ dotnet publish → Docker 或 IIS/Nginx 部署EntityBase(仅 Id)→ EntityBaseData(+审计字段/软删除)→ EntityTenant(+租户隔离),按需选择Yitter.IdGenerator 生成 long 型雪花 ID,不要设置数据库自增EntityBaseData 的实体 Delete 默认是软删除(设 IsDelete = true),物理删除用 DeleteByIdAsync[ApiDescriptionSettings("GroupName", Order = 100)] 控制 Swagger 分组[DisplayName("操作名")] 自动注册为权限标识,前端配合 v-auth 指令使用EntityTenant 后自动按 TenantId 隔离,切换租户用 _rep.Context.AsTenant().GetConnection(tenantDbConfigId)| 场景 | 推荐方案 |
|---|---|
| 从零搭建后台 | Admin.NET(Furion + SqlSugar 全家桶) |
| 已有 Furion 项目加权限 | 参考 Admin.NET 的 Auth/User/Role/Menu 模块 |
| 仅需 ORM | 直接用 SqlSugar,不引入 Admin.NET |
| 微服务架构 | RuoYi-Cloud(Java 生态) |
Yitter.IdGenerator 生成雪花 ID(long 类型)EntityBaseData 的实体默认使用软删除(IsDelete 字段)EntityTenant 自动按 TenantId 隔离数据[ApiDescriptionSettings("GroupName")] 对 Swagger 接口分组[DisplayName("操作名")] 会注册为权限标识,搭配 [Authorize] 使用BouncyCastle.Cryptography 和 sm-crypto 实现 SM2/SM3/SM4 算法.dockerignore,可直接用 Dockerfile 容器化部署面向 AI 编程助手的开源 GIS、CAD、C#、AI、IoT、3D 技能集合。覆盖 65 个开源项目,提供一站式技能索引、标签搜索、按需加载指南,让 AI 助手在 GIS/CAD/C#/AI/3D 领域获得更准确的代码生成与问题排查能力。
DocuTranslate(xunbu/docutranslate)是基于大语言模型的轻量级本地文件翻译工具,支持 PDF/Word/Excel/Markdown/EPUB/字幕/JSON 等多格式翻译,内置 MinerU PDF 解析、术语表自动生成、Web UI、REST API、Client SDK 与 MCP 接入。
AI/LLM 技能分类索引,覆盖 LLM 应用开发平台、自学习智能体、个人 AI 助手 Gateway、终端编码代理、多模型编排插件、文件翻译工具、AI 编程方法论等领域共 8 个开源项目,按需加载即可获得 Dify、Hermes Agent、OpenClaw、OpenCode、DocuTranslate 等工具的精准 AI 辅助。
geometry-api-net 是一个 .NET Standard 2.0 的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。
GIS(地理信息系统)技能分类索引,覆盖空间数据处理、地图服务、几何运算、Web 可视化等领域共 23 个开源工具,按需加载即可获得 GDAL、QGIS、GeoServer、PostGIS、JTS 等工具的精准 AI 辅助。
robotgo-flow(znlgis/robotgo-flow)是基于 go-vgo/robotgo 构建的 Windows 桌面 RPA 自动化框架,通过声明式 YAML 定义工作流,利用图像模板匹配定位屏幕 UI 元素,自动执行鼠标/键盘/浏览器操作,内置人类行为模拟、交互式录制器与 .NET 10 WPF 托盘应用。