NetCore多租户开源项目,快速后台开发企业框架,赚钱就靠她了
今天给大家推荐一个开源项目,基于.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前后端分离的开源项目
推荐一个数据可视化大屏幕报表开源系统
NetCore多租户开源项目,快速后台开发企业框架,赚钱就靠她了相关推荐
- 开源一套后台管理系统框架,远离996
前言 作为一个程序员,最苦逼的就是老板随口就给你提的需求:"小田啊,这几天你给我弄一个管理系统给客户用". 老板的一句话总是害得我们天天加班,更可怕的是,每次开个新项目,总是要从 ...
- 写开源项目到底究竟有多赚钱?
精品连载丨安卓 App 逆向课程之三 frida 注入 Okhttp 抓包上篇 选自calebporzio 机器之心编译 参与:张倩.蛋酱 如果提到靠打赏生活的人,我们首先想到的会是主播.但现实情况是 ...
- electron+vue3全家桶+vite项目搭建【一】使用开源项目快速搭建基础工程
文章目录 指引 1.创建工程 2.安装依赖 3.运行工程 4.打包工程 指引 项目地址 视频讲解 1.创建工程 直接用开源的electron构建脚手架:https://github.com/elect ...
- dva开源项目_后台前端管理系统,基于react、typescript、antd、dva及一些特别优秀的开源库实现...
react-antd-admin
- 高并发服务器开源项目,高并发服务器框架详解 - osc_qgfjs4a5的个人空间 - OSCHINA - 中文开源技术交流社区...
1)如何设计如何扩展 2)什么是高并发 (1)任务:完成某个功能的一个一个目标任务,服务器程序也是不例外的. (2)CPU核心:完成具体任务的,是CPU核心 + 周围的外设(读写磁盘IO.网络IO) ...
- 3个开源的快速开发平台,前后端都有,项目经验又有着落了!
来源:我是程序汪 经常性逛github,发现了一些优秀的开源项目,其中的框架及代码非常不错,现在给大家推荐三个快速开发平台. 第一套系统:Jeecg-boot快速开发平台 前端采用阿里的ant-des ...
- 开源项目-毕设打车后台管理系统
哈喽,大家好,今天给大家带来一个开源项目-打车后台管理系统 打车后台管理系统主要功能包括指挥中心,司机注册,司机信息修改,查看司机信息,司机注销,车辆注册,车辆查询,司机出勤情况等模块 登录 指挥中心 ...
- Android 开源项目集合
2019独角兽企业重金招聘Python工程师标准>>> 上百个Android开源项目分享,希望对android开发有帮助. Android PDF 阅读器 http://source ...
- 众多Android 开源项目推荐,给力工作给力学习
http://terryblog.blog.51cto.com/1764499/547777 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.h ...
最新文章
- jmeter 导入java_8. Jmeter导入jar包
- java多线程封装_Java 多线程处理任务的封装
- oddo docker 安装
- 转换环境与执行环境、宿主环境与独立环境、宿主实现与独立实现
- 对手机支付安全机制的思考
- 数据埋点太难!知乎的做法有何可借鉴之处?
- oracle中的输入 amp,Oracle之SQL学习
- Cable--新虚拟网络架构介绍
- 常用的比较排序算法总结
- fastDFS 命令笔记
- 掌阅电子书全系列安装第三方app教程(无需破解)
- css3实现缺角四边形_CSS3实现缺角矩形与折角矩形以及缺角边框代码实例
- 主板电源开关接口图解_图解:主板电线接法(电源开关、重启等)
- java满天星星代码_纯Java代码实现流星划过天空
- 能力值的计算:一年 365 天,以第 1 天的能力值为基数,记为 1.0,当每天好好学习时能力值相比前一天提高 1‰,当没有学习时由于遗忘等原因能力值相比前一天下降 1‰
- 电路仿真软件详谈(九),proteus电路仿真软件及版本问题
- EastWave应用案例:同轴线仿真
- springboot集成easyExcel实现文件导入导出
- 计算机调剂怎么准备复试,终于明白考研调剂复试如何准备
- java助教面试自我介绍,助教面试自我介绍
热门文章
- 计算机组成原理branch,处理器结构--分支预测(Branch Prediction)
- 【C语言】将非负整数转换为二进制输出(用递归函数实现)
- bvs是什么意思_电磁场中的B和H是什么意思?
- FRN+TLU,小batch size训练的福音
- python爬取豆瓣小组_Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图
- Android深入--02--下载源码
- INS-35178错误,AMM及ASMM区别
- 邻接表实现的有向带权图 及 图算法(C++)
- java之定时器Timer
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”