中国行下一站是南京,此刻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