Skip to content

9.2 目录结构详解 ​

概述

前端目录按"共享层平铺、页面层按域分目录"组织:api/views 按域(system/data/content/monitor/tool)对应后端模块域;components/store/utils/hooks 全局共享。本节逐层说明。

src 目录树 ​

text
ui/src/
├── App.vue
├── main.ts                    # 入口:挂载 Pinia/Router/ElementPlus 等
├── api/                       # 接口模块(按域分目录)
│   ├── common/                #   city/index/menu/user(跨域公共接口)
│   ├── content/               #   article/category/link
│   ├── dashboard/             #   console/message
│   ├── data/                  #   city/config/dictionary/notice/param
│   ├── file/                  #   fileTemplate
│   ├── monitor/               #   cacheMonitor/job/onlineUser/serverMonitor…
│   ├── region/                #   region(区划)
│   ├── setting/               #   profile/web
│   ├── system/                #   dept/dictionary/level/loginLog/menu/operLog/position/role…
│   └── tool/                  #   example/generator
├── components/                # 公共组件(25 类)
│   ├── Application Authority CheckToken ChinaArea CountTo Cropper Editor
│   ├── Excel Form Lockscreen Modal Page Password Qrcode Region Render
│   ├── Select Table TableSelect Upload Websocket icon importFile
│   ├── numberInput pagination priceInput …
├── directives/                # 自定义指令
│   ├── permission.ts          #   权限指令(按钮级显隐)
│   ├── clickOutside.ts / scrollBar.ts
├── enums/                     # 枚举常量
│   ├── httpEnum.ts            #   RequestEnum/ResultEnum/ContentTypeEnum
│   ├── pageEnum.ts cacheEnum.ts permissionsEnum.ts roleEnum.ts …
├── hooks/                     # 组合式函数
│   ├── core/ event/ setting/ web/
│   ├── use-async.ts useBattery.ts useDomWidth.ts useOnline.ts useTime.ts
├── layout/                    # 布局系统(侧栏/顶栏/标签页/面包屑)
├── router/
│   ├── constant.ts            #   常量路由(login/redirect/403/404…)
│   ├── generator-routers.ts   #   动态菜单路由生成(消费 getMenus)
│   ├── router-guards.ts       #   守卫(token 校验/动态路由注入/进度条)
│   ├── base.ts router-icons.ts menus/ types.ts index.ts
├── settings/                  # 全局设置
│   ├── projectSetting.ts      #   项目设置(主题/水印/标签页等)
│   ├── designSetting.ts componentSetting.ts animateSetting.ts
├── store/                     # Pinia
│   ├── modules/
│   │   ├── user.ts            #   登录/令牌/身份信息
│   │   ├── asyncRoute.ts      #   动态路由
│   │   ├── tabsView.ts        #   标签页
│   │   ├── designSetting.ts projectSetting.ts lockscreen.ts ossConfig.ts
│   ├── mutation-types.ts      #   ACCESS_TOKEN 等存储键常量
│   ├── index.ts types.ts plugins/
├── styles/                    # 全局样式与主题变量(Element Plus 变量覆盖)
├── utils/
│   ├── http/axios/            #   HTTP 封装(VAxios/transform/checkStatus…)
│   ├── auth.ts Storage.ts     #   路径工具 / 本地存储封装
│   ├── downloadFile.ts dateUtil.ts validate.ts propTypes.ts …
│   ├── file/ helper/ is/ lib/
├── views/                     # 页面(按域分目录)
│   ├── system/ data/ content/ monitor/ tool/ file/ setting/
│   ├── dashboard/ login/ exception/ iframe/ redirect/ about/
└── plugins/ assets/

命名约定 ​

text
api 文件:驼峰(fileTemplate.ts、onlineUser.ts)
views 目录/文件:域/驼峰模块(content/article/index.vue)
配置文件:camelCase(columns.ts、querySchemas.ts)
组件:PascalCase(.vue)
后端对照:前端驼峰 ↔ 后端 snake(fileTemplate ↔ file_template)——
         联调时注意两边命名形态不同

页面标准五件套 ​

text
views/{域}/{模块}/
├── index.vue        # 列表页(分页表格 + 筛选 + 增删改入口)
├── edit.vue         # 新增/编辑弹窗
├── detail.vue       # 详情
├── columns.ts       # 表格列配置
└── querySchemas.ts  # 筛选表单配置

(生成器树形模块用 ui2 模板:index/edit/detail 三件,无 columns/querySchemas)

分目录的理由 ​

层组织方式理由
api/views按域分目录与后端模块域、生成器 genDomainMap 一致,心智对齐
components/hooks/utils全局平铺跨域共享,避免"通用组件放哪个域"的争议
enums/settings/styles全局全局配置面
store/modules按状态域一文件user/asyncRoute 等状态域清晰

小蚂蚁云团队 · 提供技术支持