Skip to content

模块化设计

概述

Ruoyi-Plus-Uniapp 框架采用高度模块化的设计理念,通过清晰的目录结构和模块划分,实现了代码的高内聚、低耦合。每个模块都有明确的职责边界,便于开发、维护和扩展。

模块化架构图

📁 plus-ui/
├── 🔧 配置层    # 环境配置、构建配置
├── 📡 接口层    # API 接口管理
├── 🎨 表现层    # 组件、布局、页面
├── 🧠 逻辑层    # 状态管理、组合函数
├── 🛠️ 工具层    # 工具函数、指令、类型
└── 🌍 资源层    # 静态资源、国际化

核心模块设计

📡 API 接口层 (/api)

设计原则:按业务域垂直划分,每个模块独立管理

typescript
// 模块结构
src/api/
├── business/    # 业务相关接口
│   ├── base/    # 基础业务
│   └── mall/    # 商城业务
├── system/      # 系统相关接口  
│   ├── auth/    # 认证授权
│   ├── core/    # 核心功能
│   └── monitor/ # 系统监控
└── tool/        # 工具相关接口

特点

  • 按域划分:每个业务域独立管理 API
  • 类型安全:完整的 TypeScript 类型定义
  • 统一规范:统一的请求响应格式
  • 错误处理:集中的错误处理机制
typescript
// API 模块示例
// /api/system/auth/authApi.ts
export const userLogin = (data: LoginRequest): Result<AuthTokenVo> => {
  return http.post<AuthTokenVo>('/auth/userLogin', data, {
    auth: false,
    isEncrypt: true
  })
}

🎨 组件系统 (/components)

设计原则:原子化设计,可复用优先

typescript
// 组件层次结构
src/components/
├── AForm/           # 表单组件库(原子级)
│   ├── AFormInput.vue
│   ├── AFormSelect.vue
│   └── ...
├── ASearchForm/     # 搜索表单(分子级)
├── AOssMediaManager/# 媒体管理(组织级)
└── UserSelect/      # 业务组件(模板级)

分层策略

  • 原子级:基础表单控件 (AForm*)
  • 分子级:功能组合组件 (ASearchForm)
  • 组织级:业务功能模块 (AOssMediaManager)
  • 模板级:页面级业务组件 (UserSelect)

🧠 状态管理 (/stores)

设计原则:单一职责,模块化管理

typescript
// 状态模块划分
src/stores/modules/
├── user.ts         # 用户状态(认证、信息)
├── permission.ts   # 权限状态(路由、按钮权限)
├── theme.ts        # 主题状态(样式、布局)
├── tagsView.ts     # 标签页状态
├── dict.ts         # 字典状态
└── state.ts        # 应用全局状态

模块特点

  • 职责单一:每个模块管理特定领域状态
  • 组合式 API:使用 Pinia 的组合式写法
  • 类型安全:完整的 TypeScript 支持
  • 持久化:支持本地存储持久化
typescript
// 状态模块示例
export const useUserStore = defineStore('user', () => {
  // 状态定义
  const userInfo = ref<SysUserVo | null>(null)
  const roles = ref<string[]>([])
  
  // 操作方法
  const loginUser = async (data: LoginRequest) => { /* ... */ }
  const fetchUserInfo = async () => { /* ... */ }
  
  return { userInfo, roles, loginUser, fetchUserInfo }
})

🎣 组合函数 (/composables)

设计原则:逻辑复用,功能内聚

typescript
// 组合函数分类
src/composables/
├── useAuth.ts       # 权限相关
├── useDict.ts       # 字典管理  
├── useHttp.ts       # HTTP 请求
├── useTheme.ts      # 主题管理
├── useDialog.ts     # 弹窗管理
├── useDownload.ts   # 文件下载
└── useTableHeight.ts# 表格高度计算

设计特点

  • 功能内聚:相关逻辑集中管理
  • 响应式:基于 Vue 3 响应式系统
  • 可测试:独立的函数便于单元测试
  • 类型安全:完整的 TypeScript 支持
typescript
// 组合函数示例
export const useDict = (...dictTypes: string[]) => {
  const dictStore = useDictStore()
  const dictObject = reactive<Record<string, DictItem[]>>({})
  const dictLoading = ref(true)
  
  // 逻辑处理...
  
  return { ...toRefs(dictObject), dictLoading }
}

🛠️ 工具函数 (/utils)

设计原则:纯函数,无副作用

typescript
// 工具函数分类
src/utils/
├── string.ts        # 字符串处理
├── object.ts        # 对象操作
├── array.ts         # 数组处理
├── date.ts          # 日期处理
├── format.ts        # 格式化
├── validators.ts    # 表单验证
├── crypto.ts        # 加密解密
└── cache.ts         # 缓存操作

特点

  • 纯函数:无副作用,易于测试
  • 类型安全:完整的输入输出类型定义
  • 按需导入:支持 Tree Shaking
  • 文档完善:详细的 JSDoc 注释

🎨 布局系统 (/layouts)

设计原则:层次化布局,可配置组合

typescript
// 布局组件结构
src/layouts/
├── components/
│   ├── AppMain/     # 主内容区
│   ├── Navbar/      # 顶部导航
│   ├── Sidebar/     # 侧边栏
│   ├── TagsView/    # 标签页
│   └── Settings/    # 设置面板
├── Layout.vue       # 后台主布局
└── HomeLayout.vue   # 前台布局

布局特性

  • 模块化:每个布局组件独立
  • 可配置:支持动态配置显示/隐藏
  • 响应式:适配不同屏幕尺寸
  • 主题化:支持主题切换

🛣️ 路由系统 (/router)

设计原则:模块化路由,权限控制

typescript
// 路由模块结构
src/router/
├── modules/
│   ├── constant.ts  # 静态路由
│   ├── system.ts    # 系统模块路由
│   └── tool.ts      # 工具模块路由
├── utils/           # 路由工具
├── guard.ts         # 路由守卫
└── router.ts        # 路由配置

路由特性

  • 模块划分:按功能模块组织路由
  • 动态路由:基于权限动态生成
  • 路由守卫:完整的权限控制
  • 类型安全:路由参数类型检查

模块通信机制

🔄 模块间通信

typescript
// 1. 状态管理通信
const userStore = useUserStore()
const { userInfo } = storeToRefs(userStore)

// 2. 组合函数通信
const { isAuthenticated } = useAuth()
const { dictData } = useDict('sys_user_status')

// 3. 提供/注入(Provide/Inject)
// 父组件
provide('theme', themeConfig)
// 子组件  
const theme = inject<ThemeConfig>('theme')

// 4. Props/Emit 组件通信
// 父组件
<UserSelect @change="handleUserChange" />
// 子组件
const emit = defineEmits<{
  change: [user: UserInfo]
}>()

📦 模块依赖管理

typescript
// 依赖层次(由底层到上层)
工具层 (utils) 

逻辑层 (composables, stores)

组件层 (components)

页面层 (views)

布局层 (layouts)

依赖原则

  • 单向依赖:上层可以依赖下层,禁止反向依赖
  • 接口隔离:通过接口定义模块边界
  • 依赖注入:通过依赖注入解耦模块关系

模块化优势

🚀 开发效率

  • 职责清晰:每个模块职责明确,减少认知负担
  • 并行开发:不同模块可以并行开发
  • 快速定位:问题定位更加精确
  • 代码复用:组件和函数高度复用

🛡️ 维护性

  • 影响隔离:模块间相互独立,修改影响可控
  • 单元测试:模块化便于编写单元测试
  • 重构安全:模块边界清晰,重构更安全
  • 版本管理:便于版本控制和回滚

📈 扩展性

  • 新功能添加:新增模块不影响现有功能
  • 模块替换:可以轻松替换整个模块
  • 渐进式升级:支持逐模块升级
  • 插件化:支持插件式功能扩展

最佳实践

✅ 命名规范

typescript
// 组件命名:PascalCase + 前缀
AFormInput.vue
AOssMediaManager.vue

// 文件命名:camelCase
useAuth.ts
userStore.ts

// 目录命名:kebab-case
user-select/
oss-media-manager/

✅ 导入导出规范

typescript
// 统一导出入口
// /utils/index.ts
export * from './string'
export * from './object'
export * from './date'

// 按需导入
import { formatDate, parseDate } from '@/utils'

✅ 模块边界控制

typescript
// 明确的接口定义
export interface UserService {
  getUserInfo(): Promise<UserInfo>
  updateProfile(data: ProfileData): Promise<void>
}

// 通过接口约束模块行为
export const useUserService = (): UserService => {
  // 实现...
}

总结

Ruoyi-Plus-Uniapp 的模块化设计通过清晰的分层架构、合理的职责划分、统一的规范约束,实现了代码的高内聚、低耦合。这种设计不仅提高了开发效率,也保证了系统的可维护性和扩展性,为企业级应用的持续发展奠定了坚实的基础。