从 2020 年 03 月,我加入 XX 团队,参与到 P 项目的迭代工作中。
我们 C 小组大约有 7 个开发,前端有 4 个。
背景
P 项目早在 18 年就启动了,我参与迭代的时候,其已经相当的成熟。
P 项目实现的是一个 B 端商城,服务于全球各类伙伴公司的采购、售后以及其它信息沟通,大到国包、省包、各级渠道商,小到各地零售门店。
P 项目连接的上下游系统非常的广泛,涉及仓库、商品、订单、客户、营销政策、激励等
项目规模十分宏大,整个部门围绕它划分了 4 个组,分别负责大客户、零售客户等。我们 C 组主要负责的是大客户这部分的业务功能。
我下边主要讲下整个前端项目的架构以及这部分业务。
业务模块
-
系统管理站点
- 卡片管理
- 卡片注册
- 卡片列表
- 站点管理
- 菜单管理
- 权限管理
- 用户管理
- 角色管理
- 国际化
- 字典管理
- 卡片管理
-
公共部分
- 消息
- 通知
- 公告
- 导入导出
-
大客户站点
- 购物车
- 提交订单
- 我的框架
- 订单管理
- 订单确认
- 分批发货
- 送货预约(2 个前端)
- 退换货
- 地址分配
- 备案地址
- 我的客户
-
大客户财经站点
- 发票核销(重度优化,组件拆分,业务逻辑整理)
- 激励对账(3 个前端)
项目架构
P 项目基于 Vue 2.0 + VueRouter 开发、webpack 打包,以 element UI 为基础的 yUI 组件库。应用基于卡片式架构,有自己的启动引擎,核心代码封装在 app.js。通常一个页面就是一个组件,用 webpack 以 umd 规范打包并混淆之后,上传到 CDN。运营端有一个页面设计器,用于构建前端页面,构建页面就是将卡片放进布局容器中。本人实现了一个简单的卡片式架构引擎,您可前往 Codepen 查看,演示链接:
https://000252617.codepen.website/card-style/?d=1618487271672#/
src 目录规划:
- src/
- shared/
- cards/
- site001/
- component001/
- component002/
- component003/
- site002/
- component004/
- component005/
- component006/
- site001/
对于每个组件目录,需要有一个 index.js 文件,暴露出组件配置对象:
import Component from "./card.vue"
export default Component
开发流程
- 创建菜单:url、权限、主题、等
- 创建卡片源文件:在 src 目录下新建 vue 组件
- 业务开发完成
- webpack 打包为 js 卡片资源
- 到运营端注册一个卡片,并上传卡片资源
- 设计页面:布局、卡片实例权限、页面权限、等
- 预览
核心概念
- 应用(app):整个
- 站点(group):由主题、权限、语言组成
- 菜单:树形结构、用于站点导航,菜单项包含“布局”、“链接”、“节点” 3 种类型
- 页面(page):挂在菜单的(布局)节点上
- 卡片:注册到系统的组件文件,可在页面实例化,实例化之后称为卡片实例
- 用户:用于访问 webapp 的站点的身份,可以是 w3 账号,也可以是 uniportal 账号
- 权限:可以称为用户类型,用于限定站点、页面、卡片的访问
- 用户权限:站点 + 角色 [+ 公司]
- 菜单权限:针对角色,有权限方能显示
- 页面权限:角色是否能访问到这个页面
- 卡片实例权限:角色是否能访问到这个页面上的此卡片实例
我的业绩
- 引入 TypeScript、为常用库添加类型声明、为 Vue 实例追加内置成员类型声明
- 扩展了卡片构建系统,使之支持批量打包
- 核心业务开发
问题以及思考
没有引入卡片版本控制机制
卡片一旦作为 js 资源存在,就脱离了 Git 版本管理。也就是说,Git 的分支或者标签在本项目中不能作为线上资源的标准。我们采取了人工管理手段,将本轮迭代的卡片等资源收集起来,然后以业务验收后的 SIT 环境为最终版本。
对于公共组件的更新,将涉及多张卡片的重新打包和发布,步骤繁琐
是的,卡片的构架优秀的一点就是,整个系统非常的松散,你可以迅速下架、更新某个页面,而不必打包整个系统,这非常棒。但是同时,我们所付出的代价就是,一旦某个公共代码块出现问题,我们必需打包所有对其有依赖的卡片,然后上传,这个操作之繁琐也是不争的事实。我们无法使用 CI / CD 进行持续的发布了。
作为思考
我认为可以对我们卡片追加版本控制系统,当我们发现卡片的源文件发生了变动,我们就可以启动 CI 系统对其自动打包,然后自动发布。当然,这个自动并非完全自动,我们必需确保变动是需要上线的。
这样,我们以仓库的某分支或者标签为上线基准,由此可以省却统计卡片资源的时间了。