# 中后台系统常见需求
# 数据获取、前后端通信
# 数据获取
参考资料:
# 报错信息统一处理
# API 接口缓存
缓存可以放到 Axios/API/Service 层,也可以放到 Redux/Vuex 层。
有的缓存是有上下文的,一些操作 (如:切换xxx) 会切换上下文,这时需要清空缓存避免脏数据。
# 常见组件
# 按钮
# 图标按钮 (IconButton)
以 ElementUI、AntDesign 组件库为例,IconButton 可以支持组件库自带图标和自定义图标。
但组件库自带图标和自定义图标混用容易导致样式体验不一致。
这里介绍了如何在 Vue ElementUI 下使用自定义图标并保证 IconButton 的体验一致性。
# 异步按钮 (AsyncButton)
对于触发异步操作的按钮,需要有 Loading 状态。
# 常见布局
# 登录、授权
【需求】在 login.html 登录后,跳转到 user.html。这个跳转的动作可以用 JS 来实现:location.href = '/user.html'
,这时浏览器会向服务器发请求获取 user.html。
【技术难点】HTML 是无状态协议,当访问 user.html 时服务器根本“不记得”用户已经登录了。有许多办法来解决这个问题:
- 使用 Cookie,这主要是后端技术,前端不需要感知,很少需要在 JS 里面访问 Cookie
- 如果前端是 SPA 单页应用,则不存在页面跳转的问题
对于 SPA 单页应用,登录过程是:前端发起 POST 请求、POST 响应中带有 token 信息和 UserInfo,前端需要保存 token 信息,此后发给后端的 HTTP 请求中都要带上 token。
【技术实现】前端需要判断是否已登录,以便显示不同的界面。
- React 应用可以使用 Redux 维护 UserInfo 信息
【技术实现】后续前端发送给后端的请求都需要携带 token,一般我们是放在 HTTP 请求头里面。
- 如果使用 Axios,可以很方便地做到这一点
# 记住密码、7天免登陆
# 表单
# 表单的初始数据
# 表单前端校验
# 表单后端校验
# 动态表单
# 分步表单
# 自定义表单控件
# 区分新建、编辑两种模式
# 常用表单控件
# 日期控件
需求:禁止选择今天以前的日期
我们需要判断 time
是否小于当前时间,dayjs(time).isBefore(dayjs(), 'day')
# 锚点滚动
点击提交按钮,校验失败的表单控件会有红色报错。如果表单特别长的话,错误提示信息可能会在屏幕之外用户看不到,所以希望页面能滚动到第一条错误的位置。如下图所示 (图还没画)。
# 列表页、表格页
# 分页
# 无限滚动、瀑布流
# 搜索、筛选
# 加载状态
# 排序
# 路由
除非特别说明,技术栈一律采用 react-router。
# 路由配置对象
中后台系统有很多路由,而且需求经常变,路由写死在组件里面不太好。希望能将路由配置在 JS 对象里面,然后根据这个配置自动生成路由。
例子:路由写死在组件里面
todo
例子:路由配置对象
todo
# 路由参数
# 嵌套路由
路由会共用一些布局 UI,所以需要支持嵌套路由。todo: 太难描述了,要给个图。
如果路由是写死在组件内的话,事情变得很容易。但我们之前有需求是将路由配置在 JS 对象里,这样事情就变得困难很多。
例子:如果路由是写死在组件内
todo
例子:如何支持配置嵌套路由
todo
# 路由权限控制
由于路由配置是 JS 对象,所以可在运行的时候动态生成,自然能实现各种灵活的需求。
【方案一】对于没权限的路由就直接删掉,实现简单。缺点是无法区分 403 和 404,前者是无访问权限,后者是 URL 路径错误。
【方案二】在路由跳转前进行“拦截”,如果没有权限则执行相应业务逻辑 (跳到 403 页面、跳到登录页)。
# 基于路由生成菜单导航
以 react-router 为例,路由是扁平结构,而菜单是树形结构,所以需要转换。
需求是实现路由配置转成菜单配置,关键难点:
- 扁平结构转树形结构,基于公共前缀实现 (考验算法功底了)
- 结合路由权限控制,对于无权限路由不应该转成菜单
- 有些路由需要转成菜单,有些不需要
# 集成第三方库
# ECharts
# D3.js
# 复杂业务需求
# 文字溢出
文字溢出是 CSS 控制的,但我们需要在 JS 测检测文字溢出,对于溢出的文字启用鼠标悬浮 Tooltip。
# 拖拽
# 动态改变页面布局
# 定制主题
# 国际化
# 精细控制组件权限
# 分布确认框
当用户进行危险操作的时候,需要弹框询问用户是否确认操作。对于更加复杂的场景,需要结合后端计算,多次询问用户是否确认操作。
例如对于这样的业务场景:
- 用户点击删除xxx规则,提示「删除无法恢复,确定删除xxx吗」,同时向后端请求 API
- 后端收到 API 后,计算删除xxx规则会导致的后果,这一步需要较长的时间
- 前端在 API 请求返回之前,都要显示 Loading 状态
- API 请求返回后,根据情况,如果不含危险操作就直接删除
- 如果含有危险操作,则二次确认提示「删除xxx将导致xxx,是否确认删除」
我们采用状态机的风格来设计组件的 API。
# 复杂 Loading
复杂的需求:
- 显示 Loading 百分比
- 显示 Loading 阶段,例如:正在进行合法性校验、正在统计受影响的设备、正在关闭设备