中国行下一站是南京,此刻G1920正离开上海虹桥站。一路行走,总得记录一下大家的供需,把人脉网连接起来。恰巧第一站是ERP主题,那就开始ERP之旅,先做个简单的CRM吧。
Get Started
准备好vs2019,开始建立项目
选择ASP.NET Core Web 应用
这里主要设置好项目名称 NewLife.ERP 和位置 D:\X
项目类型选择最新的正式版.NET5.0,不要启用HTTPS,因为大型应用都在nginx或者LB背后,由负载均衡挂载证书
新建好的项目是这样子
我们从nuget引用魔方 NewLife.Cube.Core
这里需要特别注意,是 NewLife.Cube.Core 而不是 NewLife.Cube,后者NewLife.Cube是 ASP.Net 4.5 版本魔方,已经有一年多没有维护。前者 NewLife.Cube.Core 是.NETCore版本,支持3.1/5.0/6.0。
安装完成后,要加几行代码,Program的Main函数最开头加上 XTrace.UseConsole()。这行主要为了把日志转移到控制台,只为方便开发调试,默认是Log子目录日志文件。
Startup中需要引入魔方并配置默认路由。由于新建项目是纯RazorPage风格,而魔方还是MVC为主,因此需要额外多了一点代码。
至此,代码修改完毕。
在vs2019上面调试栏,选择启动方式为 NewLife.ERP。
然后F5把项目跑起来,可以看到它在下载SQLite驱动,这是XCode在准备数据库环境。由于没有配置数据库连接字符串,默认使用SQLite。正式部署的时候,在appsettings.json中配置连接字符串即可,支持MySql、SQLite、SqlServer、Oracle、Postgresql、达梦等多种数据库。
在启动过程中,魔方将会进行数据初始化,添加默认角色、菜单以及授权。
提示:NewLife系列开源项目的文档也许不够完善,但是日志绝对足够丰富。可以在控制台查看,也可以在Log子目录查看。不管遇到什么问题,基本上都可以通过日志发现一些蛛丝马迹。
启动完成后,自动打开浏览器,可以看到以下的默认页面
在地址栏后面增加admin,也就是访问 http://localhost:5000/admin,进入魔方后台页面
这是后台登录页面,可以输入用户名密码 admin/admin进入,也可以注册一个用户进入,还可以点击下面的第三方登录进入。我们使用admin/admin登录,可以看到以下页面。
不管哪一种方式登录,第一个进入系统的账号将获得最高管理员权限,如果第一用户不是admin,那么将同时把admin降权和禁用,以免带来安全风险。这是魔方的“抢管理权”机制。
如果点击第三方登录,将会进入 NewLife 部署的SSO,该SSO连接了很多种常见的OAuth2.0第三方登录。NewLife.SSO将能够大大简化开发调试过程,避免了开发过程中反复登录。安全起见,不建议正式环境使用NewLife.SSO,如有需要,可以自己使用魔方源码部署一个SSO。
选择QQ登录
登录完成后进入ERP后台,可以看到我的个人信息已经加载进来。
为了方便大家开发调试,在SSO中设置了经由 NewLife.SSO 登录的用户,都将下发“管理员”角色。而管理员默认在系统中拥有最高权限。因此,不建议正式系统连接NewLife.SSO,否则随便一个经由NewLife.SSO登录的用户,都将能够以最高管理员权限进入你的系统。
增加CRM子系统
高铁已经到达常州站,前面是目的站--南京南站,我得抓紧点。
为了加快进度,我们有请零代NewLife.Zero脚手架项目:
https://github.com/NewLifeX/NewLife.Zero
http://git.newlifex.com/NewLife/NewLife.Zero
零代Zero是NewLife系列产品的脚手架项目,用于给各种场景项目提供标准例程。
把代码下载回来,打开项目是这样的结构
我们把其中的 Zero.Data 拷贝到 NewLife.ERP 目录下,并改名为 Erp.Data,加入解决方案
同时把DLL目录也拷贝过去,该目录里面的 NewLife.Core.dll 和 XCode.dll 仅用于代码生成
Erp.Data 有个 Zero.Core 的项目引用,需要删除。以后有Erp.Core了再加回去。
现在的项目大概这样子
在Erp.Data新建Customer子模块,一般每个子模块独立一个目录,分门别类管理实体类。拷贝Build.tt和Model.xml过去,准备开始建立数据模型。
数据模型如下:
<?xml version="1.0" encoding="utf-8"?> <Tables xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.newlifex.com http://www.newlifex.com/Model2020.xsd" NameSpace="Erp.Data.Customers" ConnName="Erp" Output="" BaseClass="Entity" xmlns="http://www.newlifex.com/Model2020.xsd"> <Table Name="Customer" Description="客户。客户中心的一切资源,以客户为中心"> <Columns> <Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" /> <Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" /> <Column Name="FullName" DataType="String" Description="全名" /> <Column Name="CreateUser" DataType="String" Description="创建者" /> <Column Name="CreateUserID" DataType="Int32" Description="创建人" /> <Column Name="CreateIP" DataType="String" Description="创建地址" /> <Column Name="CreateTime" DataType="DateTime" Description="创建时间" /> <Column Name="UpdateUser" DataType="String" Description="更新者" /> <Column Name="UpdateUserID" DataType="Int32" Description="更新人" /> <Column Name="UpdateIP" DataType="String" Description="更新地址" /> <Column Name="UpdateTime" DataType="DateTime" Description="更新时间" /> <Column Name="Remark" DataType="String" Length="500" Description="备注" /> </Columns> <Indexes> <Index Columns="Name" Unique="True" /> </Indexes> </Table> </Tables>
该数据模型,我们只增加了一张客户表,连接名Erp,命名空间Erp.Data.Customers。
在build.tt上右键,执行自定义工具,得到实体类
NewLife.ERP作为最终运行项目,添加对Erp.Data的项目引用
再去NewLife.Zero拷贝 Zero.Web\Areas 目录到我们的 NewLife.ERP 底下,修改一下名称为 Customers。把多余文件删掉,得到下图。
CustomersArea修改如下
using System; using System.ComponentModel; using NewLife; using NewLife.Cube; namespace NewLife.ERP.Areas.Customers { [DisplayName("客户中心")] public class CustomersArea : AreaBase { public CustomersArea() : base(nameof(CustomersArea).TrimEnd("Area")) { } static CustomersArea() => RegisterArea<CustomersArea>(); } }
新建控制器 CustomerController
using Erp.Data.Customers; using NewLife.Cube; using NewLife.Web; using System; using System.Collections.Generic; namespace NewLife.ERP.Areas.Customers.Controllers { [CustomersArea] public class CustomerController : EntityController<Customer> { static CustomerController() => MenuOrder = 80; protected override IEnumerable<Customer> Search(Pager p) { var start = p["dtStart"].ToDateTime(); var end = p["dtEnd"].ToDateTime(); return Customer.Search(start, end, p["Q"], p); } } }
F5跑起来!可以看到新增了“客户中心”大菜单,以及“客户”子菜单。点击进去,右边打开了客户管理页面,下方的SQL语句显示,它在建表!
新建一个客户
回到列表页
编辑一下
保存成功
高级搜索
推送源码到GitHub
高铁进入南京南站,大功告成!
https://github.com/NewLifeX/NewLife.ERP