CoreCRM 开发实录 —— 前后端分离的重构

虽然2月初就回来了,可 CoreCRM 一直到5月才开始恢复开发,期间是各种生活中的意外和不方便。

1. 为什么要重构

首先是一件很值得高兴的事情:CoreCRM 有了第一位 contributor!Larry 是我原来的一位实习生,现在在某公司做前端开发。因为 Larry 的加入,我就不再是一个人战斗了。当然,也就得考虑怎么进行合作的事情了。

年前的开发计划是:使用 Bootstrap 按照悟空CRM的样子先弄出一个可以用的版本来。然后再使用一些比较好的后台前端框架来代替 Bootstrap。在和 Larry 讨论之后,他觉得 Bootstrap 已经有点跟不上时代,以后扩展 UI 都会有一些困难。加上 Bootstrap 是 jQuery 作为交互基础的,和 VueJS 这样的框架也是不太配合。正好 Larry 的公司正在使用蚂蚁金服出品的 Ant Design 开发后台程序,他感觉这个框架设计的不错:组件丰富、设计合理、社区活跃、文档丰富(还是中文)。Ant Design 基于 React Component,也是当前非常流行的前端框架,经过多年的发展,据说其组件的丰富程度已经与 jQuery 不遑多让。

鉴于之前我使用 VueJS 做全页渲染的经验,我认为 React 这东西,如果不做 Server-Side Rendering(SSR),用户体验不会太好。如何集成 SSR,其实有两种方案:

  1. 完全使用 nodejs 来做前端服务器,ASP.NET Core 做 API 服务器
  2. 集成 node 到 ASP.NET Core 里,通过 ASP.NET Core 提供一些 Web 的服务

去年我也曾经用了一周的时间去研究几个 ASP.NET Core 的 React Server-side Rendering 方案,可一个人的精力毕竟有限,要同时使用两种语言开发,脑子的转换效率是一个问题。最后我放弃了 React,转而使用 ASP.NET Core 的 Razor 来做页面渲染了。只对其中一些动态的部分做了 VueJS 组件。不过这次情况不一样了,有 Larry 做前端的开发,我可以把更多的精力放到后面的API 开发和架构的优化上。而且,前后分离之后,还可以在对方工作滞后的情况下继续开发。所以我决定对整个项目进行重构。

2. 重构的尝试

近些年前端技术发展迅速,各种 hot reload 横行,在开发的时候要方便和高效的多。那么应该怎么来实现 SSR 呢?我进行了三次尝试:

2.1 Microsoft.AspNetCore.SpaServices

做为 ASP.NET Core 团队的作品,感觉上是比 Facebook 做的 ReactJS.NET 更好用一些。特别是和 ASP.NET Core 的互通性上,应该有一些优势。不过,ReactJS.NET 的 SSR 已经内置,写起来要容易一些。

一开始,我尝试使用 aspnetcore-spa 这个 yeoman generator,可这货居然还是使用的 typescript 做为主语言。虽然我之前也学了一点 typescript,但与别人合作的时候,就不能只考虑自己的技术栈了。为了不增加 Larry 的学习成本,以使得项目能够尽快进入开发,我决定还是自己搞一个基于 es6 的 ClientApp。方法当然也很简单:用 dva-cli 创建一下就 OK 了。

在完成了 ClientApp 的创建之后,需要添加一个 boot-server.js 来实现 SSR:

var { match } = require('react-router');
var { createServerRenderer } = require('aspnet-prerendering');

module.exports = createServerRenderer(function(params) {
    return new Promise(function (resolve, reject) {
        var re = /^\/([^\/]*)(/[^\/]*)?/;
        var matched = params.location.path.match(re);
        var controller = matched[1];
        var codeFile = './dist/' + controller;
        var App = require(codeFile); // eslint-disable-line

        var path = matched[2] === '' ? '/' : matched[2]; // this line is buggy.
        match({
            routes: App.routes,
            location: path
        }, function (err, redirectLocation, renderProps) {
            if (err) throw new Error("Route match failed: " + err);

            if (redirectLocation) new Error("I don't know how to redirect.");

            var initialState = {};
            resolve({ html: App.renderHTML(initialState, renderProps)});
        })
    });
});

params 里包含了一些从 Razor 传进来的数据,比如访问的路由、初始化数据等。这里本来应该直接使用 params.location.path来匹配路由,进行渲染的,可是我并没有使用完全的 SPA (Single Page Application) 架构,而是有所分离,所以就需要使用正则表达式分离 controller 和 action,然后再进行页内的匹配。现在 repo 里的代码只是实现了单页的测试载入,还没有正式的使用起来。

2.2 koa + Web API Server

本来以为上面这个方案就已经可以了。前端使用了 dva + antd + roadhog,可以直接运行一个 webpack-dev-server 直接进行开发。然后我再转到 Razor 里做为一个 Controller 的 View。不过,Larry 希望能完全脱离 ASP.NET Core 运行前端代码。我也考虑了使用
SpaServices 可能会有一些限制,比如:需要处理路由、不能使用 ES6,同时运行的时候也还是需要安装 Node,其实和一个独立的前端 Server 并没有什么区别。所以我又尝试把前端的 Server 完全分离出来。

这一步可能做的有点太激进了,我尝试使用 Web API 的模板重新创建了 CoreCRM 这个 project。结果就悲剧了:Web API 是非常轻量的框架,里面什么也没有。加上如果要分离前后端 Server,比较好的权限验证方案是使用 JSON-Web-Token,不然还需要在两个 Server 之前同步 session,也是比较麻烦的事情。而搞一套 JWT 的验证机制,也不是很容易。已经有的解决方案不是太简单,就是太复杂……

回归 SpaServices

上面这些困难加起来,让我觉得这里面的学习成本现在不可接受。所以就先放弃了这个方案。在经过一点设计和开发之后,我发现这其实和使用 koa 并没有太大的差别。问题总是可以通过一些服务间的交互来解决的。只是现在这个节点,使用 SpaServices 更容易上手一点。待到项目有一个可用的版本,后面可以尝试以其它的方式进行重构,也不是不可能的事情。毕竟这个项目至少还有2.0版。

3. 经验

“选择”总是一件很困难的事情。特别是每个选项都各有利弊的时候,选择就更加困难。每一种组合都是一种可能,每一种组合有都有它的局限。差别可能就在团队成员之间是不是能顺畅的合作。如果合作出现问题,能不能及时调整。

希望这次调整能给项目带来更多的活力。

转载于:https://www.cnblogs.com/holmescn/p/frontend-backend-seperated.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统功能: 1、 销售管理: 包括 6 部分创建资源库、原始资料收集、客户线索开发、客户跟踪、商机销售、订单管理。 1)创建资源库: 从网络上获得资源库,作为原始客户资料收集的来源; 2)原始资料收集 :收集到大量的目标原始客户资料以备进行潜在客户的开发; 3)客户线索开发 :集中对前面收集到的大量陌生客户进行电话拜访,提供各种高成效的辅助工具提高潜在客户 开发的成功率; 4)客户跟踪回访 :将心理学上提出的人类记忆储能曲线形成客户跟踪曲线,以自动提醒的方式帮助销售人员把握回访客户的最佳时机,达到用最少的联系次数取得商机或获得订单,有效的缩短成交客户的开发周期,从而能够最有成效的处理大批量的客户跟进。并能以最简便的方式作出联系记录; 5)商机销售: 集中对前面获得的销售机会进行推进销售,提供自动提醒跟踪与各种高效辅助工具,快速提高销售机会的成功率,同时可以进行销售失败原因分析; 6)订单管理 : 对在销售管道过程中销售成功后获得的订单记录,进行全面的统计、分析与执行。自动生成动态的 [ 销售进度曲线 ] 与 [ 团队销售业绩排行榜 ] 图形。 2、 售后管理   售后服务同样是销售管理中不可缺少的环节,也将是新一轮销售的开始,完善的售后服务管理通常会触发客户更多的重复购买。本模块提供客户反馈与服务处理的管理:记录客户的反馈、安排服务处理任务与记录处理的结果。 3、 产品管理   产品包括产品、价目表和产品分类三个模块. 产品主要管理本公司所销售或生产的产品档案信息. 价目表主要管理产品的价格信息, 一个价目表包括多个产品. 产品分类主要是对产品的类别进行管理, 使用户可以清楚的看到产品的分布, 用户可以快速的通过产品分类找到产品 . 4、订单管理   订单管理包括产品订单、项目订单和订单统计三个模块. 订单管理主要是对公司客户下的所有订单进行管理,有客户名称、订单编号、下单人、订单的状态等等 5 、 合同管理 合同管理包括合同资料管理、 合同附件、处理进展、回款管理、 合同统计等 6、 采购管理 采购包括进货单、供应商和供应商联系人三个模块. 进货单管理公司需要将要购买的产品清单, 进货单可以直接创建, 也可以把合同订单转化为进货单. 供应商主要管理为本公司提供产品的厂家或其它合作伙伴. 供应商联系人主要管理和供应商有关的联系人信息, 一个供应商可以对应多个供应商联系人. 7、 库存管理 库存包括入库单、出库单、盘点、库存余额、和初始化库存5个模块. 入库单是用户管理录入的各种类别产品的入库记录. 出库单是各种产品出库记录. 盘点是企业到相应时间对货物进行清查整理. 库存余额是对产品现有库存的准确记录. 库存初始化就是系统使用之前初始化产品的库存数量. 8、费用管理 财务主要包括应收款、应付款和费用报销三个模块. 应收款主要通过合同订单创建而来, 从而管理本公司的应收款项. 应付款主要通过采购订单创建而来, 从而管理本公司的应付款项. 费用报销主要管理企业内部的费用报销信息. 系统特点: 1. 全面详尽的客户资料及联系人信息管理,完全了解销售对象,为成功销售打下基础; 2. 可单条件、多条件组合、模糊查询等多种方式查询客户资料,甚至可根据客户来电显 示的电话号码快速查找客户; 3. 新增客户时,系统会自动检测客户是否已经存在,自动查重避免了客户资料的重复录入; 4. 新增客户时,重要的客户资料不允许为空,避免销售人员抢占客户; 5. 重要客户要填写备忘录,销售人员可随时查看; 6. 销售人员可非常方便的查看自己的工作清单,可查看任一时段自己的工作清单; 7. 自动提醒 功能,能够及时向用户发送提示讯息,主要是在计划联系时间已到、备忘录时 间已到、同事向您转移了客户时会提醒。另外销售向财务申请合同时也会向财务发送提 示讯息; 8. 销售团队可分级别进行管; 9.客户资料的访问、修改、打印等权限有严格的控制:销售代表只能操作自己的客户;销售主管可以操作本部门的所有客户;销售运作可以对所有客户资料进行操作,避免 宝贵的客户资料外泄; 10. 强大的统计分析功能:客户分布分析,业务员销售情况分析及产品销售走势等; 11. 系统安装操作简单,易学易用; 12.系统安全稳定,安全性体现在:客户资料使用权限和级别双重保险控制,在客户查询 模块中只显示少量的客户基本系统,不显示联系人和联系电话等信息,而且在客户查询模块中不允许复制资料; 13. 系统扩展性强,可以非常方便根据需要增减操作模块。 14. B/S 架构能实现互联网上的远程管理,而且速度丝毫不差,数据安全很强。 15. 能够实现对分销渠道的管理。 16. 并能根据客户需求定做 , 真正做到你买的就是您想要的 . 搜索更多相关主题的帖子: CRM oa 客户管理 客户关系管理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值