# YuebonNetCore **Repository Path**: Steven_Zh/YuebonNetCore ## Basic Information - **Project Name**: YuebonNetCore - **Description**: YuebonCore基于.Net5.0的权限管理及快速开发框架,前后端分离,核心模块包括:组织机构、角色用户、权限授权、多系统、多应用管理、定时任务、业务单据编码规则、代码生成器等,整合应用最新技术包括Asp.NetCore MVC、EF、Dapper、AutoFac、WebAPI、Swagger、Vue等。它的架构易于扩展,是中小企业的首选。 YuebonCore其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展,让Web开发更快速、简单,解决70%重复工作。轻松开发,专注您的业务,从YuebonCore FW开始! - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/yuebon/YuebonNetCore - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 795 - **Created**: 2020-12-31 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 如果对您有帮助,您可以点右上角 "Star" 支持一下,这样我们才有继续免费下去的动力,谢谢! ### 在线体验 Vue版本体验地址:[http://netvue.ts.yuebon.com/](http://netvue.ts.yuebon.com)(用户名:test,密码:test123) WebApi接口地址:[http://netcoreapi.ts.yuebon.com](http://netcoreapi.ts.yuebon.com) 官方文档:[http://docs.v.yuebon.com/](http://docs.v.yuebon.com/) 交流QQ群:90311523 ### 更新日志 更新日志 [点击查看](https://gitee.com/yuebon/YuebonNetCore/commits/master) ### 概述 YuebonCore是基于.Net5.0开发的权限管理及快速开发框架,整合应用最新技术包括Asp.NetCore MVC、Dapper、AutoFac、WebAPI、Swagger、EF、Vue等,核心模块包括:组织机构、角色用户、权限授权、多系统、多应用管理、定时任务、业务单据编码规则、代码生成器等。它的架构易于扩展,规范了一套业务实现的代码结构与操作流程,使 YuebonCore框架更易于应用到实际项目开发中。 YuebonCore FW其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展,让Web开发更快速、简单,解决70%重复工作。轻松开发,专注您的业务,从YuebonCore FW开始! ### 项目简介 YuebonCore是一套基于Net5.0 开发出来的框架,源代码完全开源!目前发布了Vue单页面版和mvc版两个版本,开发者可以根据自己的喜好选择。 使用 MIT 协议,采用主流框架,容易上手,简单易学,学习成本低。可完全实现二次开发、基本满足80%项目需求。 代码生成器可以帮助解决.NET项目70%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省人力成本,同时又不失灵活性。 操作权限控制精密细致,对所有管理链接都进行权限验证,可控制到导航菜单、功能按钮。 数据权限(精细化数据权限控制,可以设置角色可以访问的数据范围,部门、工作组、公司数据) 常用类封装,日志、缓存、验证、字典、文件、邮件、,Excel。等等,目前兼容浏览器(IE11+、Chrome、Firefox、360浏览器等) 适用范围:可以开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后台、物流管理系统、快递管理系统、教务管理系统等各类管理软件。 ### 技术介绍 前端目前采用Vue家族前端技术。 #### 前端技术 Vue版前端技术栈 :基于vue、vuex、vue-router 、vue-cli 、axios 和 element-ui,,前端采用vscode工具开发 https://www.svgtopng.cn/ 拖拽SVG文件显示图片 #### 后端技术 核心框架:.Net5.0 + Web API + Dapper + EF + autofac + AutoMapper+swagger 定时计划任务:Quartz.Net组件 安全支持:过滤器、Sql注入、请求伪造 服务端验证:实体模型验证、自己封装Validator 缓存框架:微软自带Cache、Redis 日志管理:Log4net、登录日志、操作日志 工具类:NPOI、验证码、丰富公共功能 性能分析:MiniProfiler组件 ### 项目结构 Yuebon.NetCore解决方案包含: Yuebon.Commons[基础类库]:包框架的核心组件,包含一系列快速开发中经常用到的Utility辅助工具功能,框架各个组件的核心接口定义,部分核心功能的实现; Yuebon.Security.Core[权限管理类库]:以Security为基础实现以角色-功能、用户-功能的功能权限实现,以角色-数据,用户-数据的数据权限的封装 Yuebon.AspNetCore[AspNetCore类库],提供AspNetCore的服务端功能的封装,支持webapi和webmvc模式,同时支持插件式开发; Yuebon.Cms.Core[CMS基础类库],包含文章管理、广告管理等内容,以此做案例给大家开发参考。 Yuebon.WebApi[webapi接口]:为Vue版或其他三方系统提供接口服务。 DataBase是最新数据库备份文件,目前支持MS SQL Server和MySql。 ### 内置功能 1、系统设置:对系统动态配置常用参数。 2、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 3、组织机构:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 4、角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 5、字典管理:对系统中经常使用的一些较为固定的数据进行维护。 6、功能模块:配置系统菜单,操作权限,按钮权限标识等。 7、定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 8、代码生成:前后端代码的生成(.cs、.vue、.js)代码。 9、日志管理:系统正常操作日志、登录日志记录和查询;系统异常信息日志记录和查询。 10、多应用管理:支持应用调用api授权控制。 11、多系统管理:实现各子系统的统一管理和授权。 13、业务单据编码规则:可以按常量、日期、计数、时间等自定义业务单据编码规则。 14、短信和邮件:集成腾讯云短信通知和EMail发送通知 15、支持租户模式 16、支持用户定义主题风格 ### 部分界面展示 1、登录 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0124/092120_64eb54dc_1017224.png "1、登录.jpg") 2、系统模块和功能管理 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0124/092135_56b7d10b_1017224.png "4.png") 3、用户管理多角色 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/211818_f13ba83a_1017224.png "用户管理多角色.png") 4、角色管理 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/211842_be7657c3_1017224.png "2.png") 5、应用管理 支持多个应用分别设置appId和密钥,适用于多个应用访问接口,每个应用采用jwt标准化token验证访问接口。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/211927_40dbbbf1_1017224.png "应用管理.png") 6、数据字典 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/212216_0a8dc479_1017224.png "3.png") 7、多系统 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/212234_a23c3a34_1017224.png "多子系统管理.png") 8、日志管理 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0423/212256_8a482274_1017224.png "日志管理.png") 9、定时任务 ![列表](https://images.gitee.com/uploads/images/2020/0930/145634_ed46d73b_1017224.png "屏幕截图.png") 本地任务 ![本地任务](https://images.gitee.com/uploads/images/2021/0124/092152_d941062d_1017224.png "屏幕截图.png") 10、代码生成器 支持一键生成服务端代码和前端代码,复制粘贴简单快速高效实现功能 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0124/092205_a7c39eae_1017224.png "代码生成器.png") 11、WebApi 集成Swagger ![输入图片说明](https://images.gitee.com/uploads/images/2018/0719/120718_772240d6_1017224.png "9 webapi.png") ![输入图片说明](https://images.gitee.com/uploads/images/2018/0719/120732_0776845c_1017224.png "9-1 webapi.png") ### 部分应用案例 1、做个车吧 2、展途汽车 3、视奇光学仓库发货系统 4、金宝龙学校数据分析系统 5、汇聚自动化设备 6、天逸电器订单系统 ### 开发者信息 系统名称:YuebonCore快速开发平台 系统作者:YuebonCore团队 作者微信:cqinwn 发布日期:2018年07月1日 版权所有:YuebonCore开发团队出品 开源协议:Mit协议 ### 鸣谢 1、感谢@cuijianhao_admin[催催啊](https://gitee.com/cuijianhao_admin)提供mysql测试环境 ### 如果对您有帮助,您可以点 "Star" 支持一下,这样我们才有继续免费下去的动力,谢谢! ### 捐赠 如果这个项目对您有所帮助,请扫下方二维码打赏一杯咖啡。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0515/105002_d82f8d8e_1017224.jpeg "收款码.jpg") ### 前端技术 ### C#知识点 #### C# 虚方法virtual详解 在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外。 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。 如:飞禽 bird = new 麻雀(); 那么飞禽就是申明类,麻雀是实例类。 具体的检查的流程如下: 1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数; 2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。 3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。 知道这点,就可以理解下面代码的运行结果了: ``` using System; namespace VirtualMethodTest { class A { public virtual void Func() // 注意virtual,表明这是一个虚拟函数 { Console.WriteLine("Func In A"); } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine("Func In B"); } } class C : B // 注意C是从A类继承,所以B是父类,C是子类 { } class D : A // 注意B是从A类继承,所以A是父类,D是子类 { public new void Func() // 注意new ,表明覆盖父类里的同名类,而不是重新实现 { Console.WriteLine("Func In D"); } } class program { static void Main() { A a; // 定义一个a这个A类的对象.这个A就是a的申明类 A b; // 定义一个b这个A类的对象.这个A就是b的申明类 A c; // 定义一个c这个A类的对象.这个A就是b的申明类 A d; // 定义一个d这个A类的对象.这个A就是b的申明类 a = new A(); // 实例化a对象,A是a的实例类 b = new B(); // 实例化b对象,B是b的实例类 c = new C(); // 实例化b对象,C是b的实例类 d = new D(); // 实例化b对象,D是b的实例类 a.Func(); // 执行a.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类A,就为本身 4.执行实例类A中的方法 5.输出结果 Func In A b.Func(); // 执行b.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类B,有重载的 4.执行实例类B中的方法 5.输出结果 Func In B c.Func(); // 执行c.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类C,无重载的 4.转去检查类C的父类B,有重载的 5.执行父类B中的Func方法 5.输出结果 Func In B d.Func(); // 执行d.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类D,无重载的(这个地方要注意了,虽然D里有实现Func(),但没有使用override关键字,所以不会被认为是重载) 4.转去检查类D的父类A,就为本身 5.执行父类A中的Func方法 5.输出结果 Func In A D d1 = new D(); d1.Func(); // 执行D类里的Func(),输出结果 Func In D Console.ReadLine(); } } } ``` ### 克隆别人的项目如何保持更新 * 那如何把 clone 后修改的代码提交到 github 呢? > github上 不是有个fork么, 好,那么给别人的项目提交代码的方式就有了,先fork下别人的代码,于是你的github上就出现了同名的项目,这个项目就属于你自己了,你把这个自己的项目git clone到本地,修修改改,然后push到你自己的项目里, * 那么你如何把你对自己项目的改动,给发到之前fork的那个原项目呢? > 在github上你的项目页面有个按钮,叫Pull request,对 你点它就会把你的修改发到对方的项目里,人还会收到邮件呢,由原项目主人决定是否接受你的修改 * 在你fork他的项目之后,如果他又更新了代码,你自己fork的项目怎么做到和原项目同步呢? > 解决方法一:github居然可以给项目添加合作者,也就是说,你想参与我的项目,你跟我说一声,我就把你添加到我的项目里作为合作者,这个选项在项目的设置里面有,只要我添加你了,你就可以git clone我的代码然后修修改改,然后直接push上来就行了,就不用fork那么麻烦了,如果你要更新服务器代码,只要git pull就行了,合作者这东西多方便 >解决方法二:你先git clone我的代码到本地,然后修修改改,然后你不是不能push到我的项目里么,你可以先在github页面上fork我的项目,有了你自己的项目地址(url)之后呢,你在本地操作git remote add [sort name] [your url],意思就是添加第二个远程仓库地址,这个仓库的“昵称”就是你刚指定的[sort name],你之后push文件呢 就通过指定这个[sort name]来push到这个你自己的仓库里等你觉得想要把你改的发给原项目同步,就在你的项目上点Pull request按钮.说下另一种情况,如果是,原项目发生了改动,你要想同步到本地,就直接从git fetch origin 从原项目的地址同步代码,然后再merge就好了当然,你可以通过新建分支的方式往自己的项目上push,这样同步的时候直接fetch就行了 欢迎你加入我们一起共商、共建、共享技术成果!开源让我们进步,开源让我们开阔视野! 有任何疑问加微信cqinwn或加入[QQ群 90311523](https://jq.qq.com/?_wv=1027&k=p6IUTzDF),点击链接加入群聊[【YuebonCore交流群】](https://jq.qq.com/?_wv=1027&k=p6IUTzDF) ### 表 #### WO_WorkOrderBill ``` CREATE TABLE [dbo].[WO_WorkOrderBill]( [Id] [nvarchar](50) NULL, [CustName] [nvarchar](255) NOT NULL, [EmployeeName] [nvarchar](255) NOT NULL, [Date] [datetime] NULL, [StartPlace] [nvarchar](255) NOT NULL, [EndPlace] [nvarchar](255) NULL, [Material] [nvarchar](255) NULL, [MustQty] [decimal](8, 2) NULL, [RealQty] [decimal](8, 2) NULL, [EtcAmount] [decimal](8, 2) NULL, [CashTolls] [decimal](8, 2) NULL, [MaintenanceCost] [decimal](8, 2) NULL, [CleanCost] [decimal](8, 2) NULL, [Penalty] [decimal](8, 2) NULL, [OtherCost] [decimal](8, 2) NULL, [CashOilL] [decimal](8, 2) NULL, [CashOilR] [decimal](8, 2) NULL, [CardOilL] [decimal](8, 2) NULL, [CardOilR] [decimal](8, 2) NULL, [TjOilL] [decimal](8, 2) NULL, [TjOilR] [decimal](8, 2) NULL, [SjzOilL] [decimal](8, 2) NULL, [SjzOilR] [decimal](8, 2) NULL, [TotalOilL] [decimal](8, 2) NULL, [TotalOilR] [decimal](8, 2) NULL, [TotalCost] [decimal](8, 2) NULL, [OilCardNo] [nvarchar](255) NULL, [OilCardNoBalance] [decimal](8, 2) NULL, [Description] [nvarchar](200) NULL, [EnabledMark] [bit] NULL DEFAULT ((1)), [DeleteMark] [bit] NULL DEFAULT ((0)), [CreatorTime] [datetime] NULL, [CreatorUserId] [nvarchar](50) NULL, [CompanyId] [nvarchar](50) NULL, [DeptId] [nvarchar](50) NULL, [LastModifyTime] [datetime] NULL, [LastModifyUserId] [varchar](50) NULL, [DeleteTime] [datetime] NULL, [DeleteUserId] [varchar](50) NULL ) ON [PRIMARY] ``` #### WO_WorkOrderBillLocation ``` CREATE TABLE [dbo].[WO_WorkOrderBillLocation]( [Id] [nvarchar](50) NULL, [WorkOrderId] [nvarchar](50) NULL, [SignDate] [datetime] NULL, [Type] [nvarchar](255) NULL, [Province] [nvarchar](255) NULL, [City] [nvarchar](255) NULL, [Area] [nvarchar](255) NULL, [Latitude] [decimal](8, 2) NULL, [Longitude] [decimal](8, 2) NULL, [Distance] [decimal](8, 2) NULL, [CreatorTime] [datetime] NULL, [CreatorUserPhone] [nvarchar](50) NULL ) ON [PRIMARY] ```