• Stars
    star
    126
  • Rank 283,466 (Top 6 %)
  • Language
    C#
  • License
    MIT License
  • Created over 4 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

后台服务项目

介绍

Base on netcore3.x,建议开发IDE Visual Studio 2019

企业应用管理系统,定位于企业应用的SaaS服务框架,企业云端应用的基础开发框架(当然也可以部署于本地),系统被设计用于多租户,采用前端后端完全分离技术方案。 抽离企业应用软件研发公共部分,让研发人员有条件聚焦在业务研发,实现了用于权限管理的基础数据维护,权限赋权,缓存,上传等常规功能。

UI项目见:

Docs

DEMO

租户1示例
租户2示例

image image

目录结构

解决方案目录结构如下:

TenantSite.Server 
├── 1-Presentation
│   ├── AlonsoAdmin.HttpApi // TenantSite.UI 的后台API项目
│   └── AlonsoAdmin.HttpApi.Init // TenantSite.Developer.Tools 的后台API项目。
├── 2-Application
│   ├── AlonsoAdmin.Services // 服务层
├── 3-Domain
│   └── AlonsoAdmin.Domain // 领域层,用于编写针对领域的逻辑函数(如事务处理等)
└── 4-Infrastructure
    ├── AlonsoAdmin.Common // Common 常用工具、用户、配置、前后端规约实体等核心类库项目
    ├── AlonsoAdmin.Entities // 数据库实体类库项目
    ├── AlonsoAdmin.MultiTenant // 多租户类库项目
    └── AlonsoAdmin.Repository // 数据仓储类库项目

配置说明

建议刚上手时使用开发人员工具进行配置。

HttpApi项目配置文件及说明如下:

{
  // 启动参数配置,更改后需重启程序生效
  "Startup": {
    // 缓存
    "Cache": {      
      "Type": 0, // 0:内存 1:Redis
      "Redis": {
        "ConnectionString": "127.0.0.1:6379,password=,defaultDatabase=2"
      }
    },
    // 日志
    "Log": {
      "Operation": true // API访问日志开关
    },
    "TenantRouteStrategy": 0 // 租户策略,0:Route模式 1:Host模式
  },
  // 系统配置,支持热更新,修改后立即生效,无需重新启动程序
  "System": {
    // 监控CURD动作得SQL语句,开启将在日志窗口中显示执行的SQL语句
    "WatchCurd": true, 
    // 用于雪花算法,数据中心ID
    "DataCenterId": 5, 
    // 用于雪花算法,工作站ID
    "WorkId": 20, 
    // 是否启用API权限验证,如果启用API需与资源绑定,否则将不允许访问API
    "EnableApiAccessControl": true, 
    // 头像上次参数
    "uploadAvatar": {
      "uploadPath": "D:/upload/avatar", // 上传根路径
      "requestPath": "/upload/avatar", // 相对根路径
      "maxSize": 1048576, 
      "contentType": [
        "image/jpg",
        "image/png",
        "image/jpeg",
        "image/gif"
      ]
    }
  },
  // 租户配置,目前采样配置方式,应该改为从总控平台获取
  "Tenants": [
    {
      "Id": "1", // 租户唯一标识
      "Code": "Tenant1",// 租户Code(唯一标识),如果为Host模式将作为租户的二级域名
      "Name": "租户1", // 租户名称
      // 当前租户的数据库参数配置,支持多数据库,不同应用可指向不同的数据库
      "DbOptions": [
        {
          // 应用数据库key
          "Key": "system", 
          // 数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4 
          // 更多支持:https://github.com/dotnetcore/FreeSql/wiki/入门
          "DbType": "0",
          "ConnectionStrings": [
            {
              // 连接字符
              "ConnectionString": "Server=localhost; Port=3306; Database=tenant1db; Uid=root; Pwd=000000; Charset=utf8mb4;", 
              // 0主库 1为从库             
              "UseType": 0 
            },
            {
              "ConnectionString": "Server=localhost; Port=3306; Database=Tenant1db; Uid=root; Pwd=000000; Charset=utf8mb4;",
              "UseType": 1 
            }
          ]
        },
        // 多数据库支持,blog为第二个应用库配置示例,与system配置结构一致
        {
          "Key": "blog",
          "DbType": "0",
          "ConnectionStrings": [
            {
              "ConnectionString": "Server=localhost; Port=3306; Database=Tenant1db; Uid=root; Pwd=000000; Charset=utf8mb4;",
              "UseType": 0
            },
            {
              "ConnectionString": "Server=localhost; Port=3306; Database=Tenant1db; Uid=root; Pwd=000000; Charset=utf8mb4;",
              "UseType": 1
            }
          ]
        }
      ],
      // 当前租户 JWT Token 配置参数
      "Items": {
        "Audience": "https://www.xxxx.com/", 
        "ExpirationMinutes": "1000", 
        "Issuer": "https://www.xxxx.com/", 
        "Secret": "2qtiOLpT7mJQx239e2kgMheAH7B9lGQJnoxYRCb7KX3x1ogDEd55I7dJ1ziYptiTF"
      }
    },
    // 复制租户1可进行租户2的配置
  ]
}

鉴权用户使用

构造函数依赖注入IAuthUser即可使用。

 public class DemoService 
    {
        private readonly IAuthUser _authUser;
        public DemoService(IAuthUser authUser)
        {
            _authUser = authUser;
        }

        public async Task<IResponseEntity> Test()
        {
            // 通过 _authUser 可获取到当前用户包括所属租户在内的信息
        }
    }

缓存使用

构造函数依赖注入ICache即可使用。

 public class DemoService 
    {
        private readonly ICache _cache;
        public DemoService(ICache cache)
        {
            _cache = cache;
        }

        public async Task<IResponseEntity> Test()
        {
            // 通过 _cache 可对缓存操作
        }
    }

新增应用接口

首先保证初始化工作完成。

待续...

ORM 使用

系统采用 Freesql 作为系统ORM,更多ORM文档见:FreeSql