Skip to content

前端开发

技术栈

  • Vue 3.5 + Composition API + <script setup>
  • TypeScript
  • Element Plus — UI 组件库
  • Pinia — 状态管理
  • UnoCSS — 原子化 CSS
  • Vite — 构建工具
  • vue-i18n — 国际化

项目结构

platform/ 和 tenant/ 遵循相同的目录规范,区别在于业务页面。

API 层 (src/api/)

每个业务模块一个文件,统一使用 myRequest 封装:

ts
// src/api/product.ts
import { myRequest } from '@/utils/request'

export const productApi = {
    list: (params: any) => myRequest.get('/tenantapi/products', { params }),
    create: (data: any) => myRequest.post('/tenantapi/products', data),
    // ...
}

请求封装 (src/utils/request.ts)

  • 基于 axios 封装
  • 自动添加 Authorization: Bearer <token> 请求头
  • 自动添加 Accept-Language 请求头(i18n)
  • 401 响应自动跳转登录页
  • 统一错误提示(ElMessage)

路由 (src/router/)

  • 动态路由:登录后从后端 API 获取菜单数据,自动生成路由
  • 路由守卫:未登录跳转登录页,已登录跳过登录页

状态管理 (src/store/)

Store作用
app全局状态(侧边栏折叠、主题配置等)
user用户信息、Token、权限列表
settings系统设置
multipleTabs多标签页管理

Hooks (src/hooks/)

Hook作用
useListPage分页列表(搜索、分页、删除一体化)
useFormDialog弹窗表单(新增/编辑、提交、重置)
useDictOptions字典数据加载

组件规范

  • 页面组件放在 views/{module}/index.vue
  • 表单弹窗放在 views/{module}/components/{Module}Form.vue
  • 通用组件放在 components/

权限指令

vue
<!-- 按钮级权限控制 -->
<el-button v-has-perm="['product.store']">新增</el-button>

<!-- SaaS 功能开关(仅 tenant 端) -->
<el-button v-feature="'code.generator'">代码生成</el-button>

国际化

语言包在 src/locales/,使用 $t('key')useI18n()t() 方法:

vue
<template>
  <span>{{ $t('common.search') }}</span>
</template>

<script setup>
const { t } = useI18n()
const label = t('common.confirm')
</script>

构建部署

bash
pnpm build

构建产物在 dist/ 目录,上传到服务器对应目录即可。

基于 Apache-2.0 协议开源