今天给大家推荐一个开源项目,基于.NetCore开发的、多租户的企业开发框架。
项目简介
这是一个基于.Net和Layui、基于多数据库的多租户,敏捷开发优选框架。系统自带权限功能、数据权限、系统日志、流程表单设计、内容管理、以及系统UI组件,系统基础功能非常完善,让开发者更注重业务的开发。
框架支持代码生成、表单设计,可以极大地提升开发效率。
采用都是目前主流的技术,该项目非常适合用于Crm、OA、ERP、CMS、WMS、BI等管理型的系统。
技术架构
1、跨平台:这是基于.Net Core开发的系统,可以部署在Docker, Windows, Linux, Mac。
2、数据库支持:MySQL、Sqlserver。
3、技术栈:ASP.NET 6.0、WEB API、QuartZ、SqlSugar、Reids、RabbitMq、Jaina、Swagger、AutoFac、LayUI。
4、开发环境:Visual Studio 2022。
项目结构
系统功能
1、首页:快捷入口、数据统计、报表、系统公告
2、单位组织:系统公告、租户设置、机构管理、数据权限、角色管理、岗位管理、用户管理
3、系统管理:系统设置、系统菜单、代码生成、数据字典、区域管理、表单设计、流程设计、条码规则、打印模块、条码生成记录
4、系统安全:系统日志、操作日志、访问控制、定时任务、服务器监控
5、流程中心:我的流程、待处理流程、已处理流程
6、文件中心:文件管理
7、信息中心:通知管理
8、内容管理:新闻类别、新闻管理
9、订单管理:订单信息
10、组件管理:图表列表、图标选择、颜色选择、下拉选择、文件上传、富文本编辑器、省市县区选择器、卡片表格
11、大屏幕报表
代码生成器
1、选择表
2、选择列表展示字段、搜索字段、排序字段、页面样式等配置
3、表单页面字段设置
4、代码生成
部分代码预览
实体
using System; using System.ComponentModel.DataAnnotations; using SqlSugar; namespace WaterCloud.Domain.GeneralManage { /// <summary> /// 创 建:超级管理员 /// 日 期:2022-11-28 20:01 /// 描 述:Articlecategory实体类 /// </summary> [SugarTable("cms_articlecategory")] public class ArticlecategoryEntity : IEntity<ArticlecategoryEntity>,ICreationAudited,IModificationAudited,IDeleteAudited { /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_Id", ColumnDescription = "",ColumnDataType = "text(50)",IsPrimaryKey = true)] public string F_Id { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_FullName", ColumnDescription = "",ColumnDataType = "text(100)", IsNullable = true)] public string F_FullName { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_ParentId", ColumnDescription = "",ColumnDataType = "text(50)", IsNullable = true)] public string F_ParentId { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_SortCode", ColumnDescription = "",ColumnDataType = "integer")] public int F_SortCode { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_Description", ColumnDescription = "",ColumnDataType = "text", IsNullable = true)] public string F_Description { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_LinkUrl", ColumnDescription = "",ColumnDataType = "text(255)", IsNullable = true)] public string F_LinkUrl { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_ImgUrl", ColumnDescription = "",ColumnDataType = "text(255)", IsNullable = true)] public string F_ImgUrl { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_SeoTitle", ColumnDescription = "",ColumnDataType = "text(255)", IsNullable = true)] public string F_SeoTitle { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_SeoKeywords", ColumnDescription = "",ColumnDataType = "text(255)", IsNullable = true)] public string F_SeoKeywords { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_SeoDescription", ColumnDescription = "",ColumnDataType = "text(255)", IsNullable = true)] public string F_SeoDescription { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_IsHot", ColumnDescription = "",ColumnDataType = "integer", IsNullable = true)] public int? F_IsHot { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_EnabledMark", ColumnDescription = "",ColumnDataType = "integer", IsNullable = true)] public int? F_EnabledMark { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_DeleteMark", ColumnDescription = "",ColumnDataType = "integer", IsNullable = true)] public int? F_DeleteMark { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_CreatorTime", ColumnDescription = "",ColumnDataType = "text", IsNullable = true)] public string F_CreatorTime { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_CreatorUserId", ColumnDescription = "",ColumnDataType = "text(50)", IsNullable = true)] public string F_CreatorUserId { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_LastModifyTime", ColumnDescription = "",ColumnDataType = "text", IsNullable = true)] public string F_LastModifyTime { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_LastModifyUserId", ColumnDescription = "",ColumnDataType = "text(50)", IsNullable = true)] public string F_LastModifyUserId { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_DeleteTime", ColumnDescription = "",ColumnDataType = "text", IsNullable = true)] public string F_DeleteTime { get; set; } /// <summary> /// /// </summary> [SugarColumn(ColumnName="F_DeleteUserId", ColumnDescription = "",ColumnDataType = "text(50)", IsNullable = true)] public string F_DeleteUserId { get; set; } } }
控制器
using System; using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using WaterCloud.Code; using WaterCloud.Domain.GeneralManage; using WaterCloud.Service; using Microsoft.AspNetCore.Authorization; using WaterCloud.Service.GeneralManage; namespace WaterCloud.Web.Areas.GeneralManage.Controllers { /// <summary> /// 创 建:超级管理员 /// 日 期:2022-11-28 20:26 /// 描 述:Articlecategory控制器类 /// </summary> [Area("GeneralManage")] public class ArticlecategoryController : BaseController { public ArticlecategoryService _service {get;set;} #region 获取数据 [HandlerAjaxOnly] [IgnoreAntiforgeryToken] public async Task<ActionResult> GetGridJson(SoulPage<ArticlecategoryEntity> pagination, string keyword) { if (string.IsNullOrEmpty(pagination.field)) { pagination.field = "F_Id"; pagination.order = "desc"; } var data = await _service.GetLookList(pagination,keyword); return Content(pagination.setData(data).ToJson()); } [HttpGet] [HandlerAjaxOnly] public async Task<ActionResult> GetListJson(string keyword) { var data = await _service.GetList(keyword); return Content(data.ToJson()); } [HttpGet] [HandlerAjaxOnly] public async Task<ActionResult> GetFormJson(string keyValue) { var data = await _service.GetLookForm(keyValue); return Content(data.ToJson()); } #endregion #region 提交数据 [HttpPost] [HandlerAjaxOnly] public async Task<ActionResult> SubmitForm(ArticlecategoryEntity entity, string keyValue) { try { await _service.SubmitForm(entity, keyValue); return await Success("操作成功。", "", keyValue); } catch (Exception ex) { return await Error(ex.Message, "", keyValue); } } [HttpPost] [HandlerAjaxOnly] [HandlerAuthorize] public async Task<ActionResult> DeleteForm(string keyValue) { try { await _service.DeleteForm(keyValue); return await Success("操作成功。", "", keyValue, DbLogType.Delete); } catch (Exception ex) { return await Error(ex.Message, "", keyValue, DbLogType.Delete); } } #endregion } }
部分功能截图
系统公告
租户设置
机构管理
数据权限
系统菜单
区域管理
表单设计
流程设计
系统日志
操作日志
访问控制
定时任务
服务器监控
图表列表
通知管理
大屏幕报表
项目地址
- End -
推荐阅读
用C#自己动手写个操作系统,爽!
C#程序采用AOT发布,真的可以避免被反编译?
盘点5个C#实用的Word、PPT、Excel、Mail第三方库
盘点6个.NetCore+Vue前后端分离的开源项目
推荐一个数据可视化大屏幕报表开源系统