今天给大家推荐一个开源项目,基于.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
}
}
部分功能截图
系统公告
租户设置
机构管理
数据权限
系统菜单
区域管理
表单设计
流程设计
系统日志
操作日志
访问控制
定时任务
服务器监控
图表列表
通知管理
大屏幕报表
项目地址
https://gitee.com/qian_wei_hong/WaterCloud
- End -
推荐阅读
-
用C#自己动手写个操作系统,爽!
-
C#程序采用AOT发布,真的可以避免被反编译?
-
盘点5个C#实用的Word、PPT、Excel、Mail第三方库
-
盘点6个.NetCore+Vue前后端分离的开源项目
-
推荐一个数据可视化大屏幕报表开源系统