# 系统框架

管理平台项目框架目标使用规范说明及部分系统 API 描述,适用于各类管理平台项目

# 目录结构描述

项目结构目录树如下

project/
│  .browserslistrc   浏览器版本配置
│  .editorconfig     编辑器配置
│  .env.development  开发环境下使用的环境变量配置文件
│  .env.production   生产环境下使用的环境变量配置文件
│  .env.test         单元测试环境下使用的环境变量配置文件
│  .eslintrc.js      ESLint 配置
│  .gitignore        设置 git 忽略上传的内容
│  babel.config.js   项目脚本兼容版本设置
│  cypress.json      cypress 配置文件
│  Dockerfile        docker 配置文件
│  package.json      项目总体描述及依赖描述
│  postcss.config.js 预编译样式
│  vue.config.js     vue-cli 脚手架配置及 webpack 配置
│ 
├─public        静态资源文件目录
│   favicon.ico 网站图标
│   index.html  网站实际入口
│ 
├─src
│  │  main.js   项目主入口
│  │ 
│  ├─assets     项目相关资产 / 附件,通常用于存放图片资源
│  │ 
│  ├─business   业务处理逻辑、框架相关 API
│  │ 
│  ├─components 通用组件
│  │ 
│  ├─modules    业务功能模块组件
│  │ 
│  ├─config 项目相关配置
│  │    constants.js       常量配置
│  │    directives.js      自定义指令集配置
│  │    element-plugins.js element-ui 插件配置
│  │    menu-path.js       系统菜单及路由匹配关系
│  │    plugins.js         项目中除 element-ui 外的插件引用配置
│  │    polyfill.js        自定义脚本兼容
│  │    validateData.js    自定义表单校验规则
│  │ 
│  ├─layout  整体布局结构
│  │ 
│  ├─router  vue-router 路由配置
│  │ 
│  ├─store   vuex 与本地缓存的相关处理
│  │ 
│  ├─styles  自定义样式文件收纳
│  │ 
│  ├─utils   工具类
│  │ 
│  └─views   系统业务功能页面
│ 
└─tests              测试模块
    ├─e2e            端对端测试
    │ 
    ├─sample         部分数据样例
    │ 
    └─unit           单元测试
        .eslintrc.js 针对单元测试的 eslint 配置
        setup.js     单元测试的前置处理

# 目录说明

部分目录功能作用说明

# components 通用组件

项目内通用组件,该目录下维护的组件应尽可能不与业务内容耦合,仅提供通用功能。例如项目中统一使用的弹出窗口组件、文件上传或图片相册展示等

# modules 业务模块组件

业务通用模块组件,modulescomponents 的区别在于该目录中维护的组件,存在根据业务定制了功能、操作形式或数据结构的,是耦合了部分业务内容的通用模块,也可以是由多个组件组合而成的一个组件集。例如

  • 存在多处应用的商品、人员详情
  • 组合了快速搜索与列表、表格的模块
  • 自定义了节点展示与交互方式的树

# layout 布局相关

项目的布局相关内容维护于该目录,仅维护布局结构与相关功能,不涉及容器内的功能实现

下例中,使用具名插槽的方式定义了 AdminLayout.vue 的布局组件

<template>
  <div class="..." style="...">
    <div>
      <slot name="header" />
    </div>
    <div>
      <slot name="aside" />
    </div>
    <div>
      <slot />
    </div>
  </div>
</template>

设置布局区域、样式并定义功能区域为具名插槽

AdminLayout.vue 布局应用于项目主页

<template>
  <AdminLayout>
    <!-- 头部具名插槽 -->
    <template #header>
      ...
    </template>
    <!-- 侧边栏具名插槽 -->
    <template #aside>
      ...
    </template>

    <route-view />
  </AdminLayout>
</template>

<script>
import AdminLayout from '@/layout/AdminLayout.vue'
export default {
  components: {
    AdminLayout
  }
}
</script>

如此,在将头部、侧边栏等公共区域内容以独立模块进行管理维护后,将相应的组件放入对应的插槽即可完成布局使用

# business 业务公共定义

业务公共常量、业务间对接或公共业务函数内容

业务公共定义模块,更大的作用是起到统一定义/注册,统一调度的目的

# 业务公共常量

项目内公共常量定义与使用

对于项目中应用的固定文本或值,推荐使用常量维护的方式而不是将常量值硬编码于业务代码中;即便该常量并不存在多处引用的情况,将常量内容进行统一维护统一引用,也更方便项目业务迭代时,对相关内容做出快速定位与修改

// src/business/constants.js

export const DEFAULT_PAGE_SIZE = 10
export const LOADING_TEXT = '数据加载中,请稍候……'
// 限制文件上传容量(50M)
export const FILE_UPLOAD_SIZE_LIMIT = 50 * 1024 * 1024
// 字段类型
export const DATA_TYPE_STRING = 'STRING'
export const DATA_TYPE_INT = 'INT'
export const DATA_TYPE_FLOAT = 'FLOAT'
export const DATA_TYPE_BIGINT = 'BIGINT'
export const DATA_TYPE_DATE = 'DATE'
export const DATA_TYPE_DATETIME = 'DATETIME'
...

上面是一组常量定义的示例,在业务代码中则直接引用这些定义的常量;如上所述,后续的业务迭代中若有内容调整,仅需在此处进行统一维护即可

格式

通常情况下,对于常量的书写方式为全大写格式,单词间使用下划线隔开

# 公共业务函数

业务相关处理函数,注意与 utils 目录内容的区别,utils 目录中维护的是业务无关性的工具类

例如某种业务编码的生成函数,业务状态的检查函数等

# 业务间对接

业务模块间功能对接,指的是业务模块之间存在部分资源互相调用时,被调用模块在 business 模块进行定义/注册,而调用模块也同样在 business 模块进行资源获取

下面通过一个简单的示例来描述对接的处理

用户管理模块在 business 模块中注册了 loadUserProfile 的加载用户详情的函数

// src/business/user.js

import { getUser } from '@/view/user'

export function loadUserProfile (id) {
  return getUser(id)
}

在订单管理模块中,有个显示用户详情的弹窗

<!-- src/view/order/user/UserProfile.vue -->
<template>
  <Dialog>
    <div>Name</div>
    <div v-text="detail.name" />

    ... 用户详情
  </Dialog>
</template>

<script>
import { loadUserProfile } from '@/business/user'

export default {
  data () {
    return {
      userId: 10,
      detail: {}
    }
  },
  beforeMounted () {
    loadUserProfile(this.userId)
      .then(resp => {
        this.detail = resp
      })
  }
}
</script>

此处直接在 business 业务模块获取了用户管理模块注册的读取用户详情的功能函数,而不是直接去用户管理模块引用相关功能代码

业务间对接虽不可避免会存在增加部分代码定义和维护的工作,但其业务调用路径单一、清晰,避免业务间交错引用的问题,为业务的独立维护,业务剥离提供了较好的设计基础

最后更新时间: 8/29/2023, 7:00:31 AM