logo
0
1
WeChat Login

Vue3 企业级后台管理系统

基于 Vue3 + TypeScript + Ant Design Vue 的现代化企业级后台管理系统,支持 COS 混合部署模式,提供完整的业务开发解决方案。

🚀 项目特色

核心特性

  • 🎯 COS 混合部署: 支持腾讯云 COS 静态资源分离部署,提升访问速度
  • 📊 动态表格/表单: 基于 JSON Schema 的动态表格和表单生成器
  • 🧩 组件化架构: 严格的组件开发规范,支持业务组件和通用组件分离
  • 🌐 国际化支持: 完整的 i18n 多语言解决方案
  • 🎨 主题定制: 支持亮色/暗色主题切换和自定义主题
  • 📱 响应式设计: 完美适配桌面端和移动端
  • 🔐 权限管理: 基于角色的访问控制 (RBAC)
  • ⚡ 性能优化: 路由懒加载、组件按需加载、虚拟滚动等

技术栈

  • 前端框架: Vue 3.5+ + TypeScript 5.x
  • UI 组件库: Ant Design Vue 4.x
  • 构建工具: Vite 5.x + Rollup
  • 状态管理: Pinia + 持久化插件
  • 路由管理: Vue Router 4.x
  • 样式方案: UnoCSS + Less
  • 代码规范: ESLint + Prettier + Husky
  • 测试工具: Mock Service Worker (MSW)
  • 部署方案: Docker + 腾讯云 COS

📋 快速开始

环境要求

  • Node.js >= 20.0.0
  • Yarn >= 4.0.0

安装依赖

# 克隆项目
git clone https://github.com/buqiyuan/vue3-antdv-admin

# 进入项目目录
cd vue3-antdv-admin

# 安装依赖
yarn install

开发调试

# 启动开发服务器
yarn dev

# 构建生产版本
yarn build

# 预览构建结果
yarn preview

部署命令

# 部署到 COS (自动版本管理)
yarn deploy

# 指定版本类型部署
yarn deploy:major    # 主版本号 +1
yarn deploy:minor    # 次版本号 +1  
yarn deploy:patch    # 修订版本号 +1

# 清理指定版本
yarn deploy:clean

# 查看当前版本
yarn deploy:version

🏗️ 项目架构

src/
├── api/                    # API 接口定义
│   ├── backend/           # 后端 API (自动生成)
│   └── demo/              # 演示 API
├── assets/                # 静态资源
├── components/            # 组件库
│   ├── basic/            # 基础组件
│   ├── business/         # 业务组件  
│   └── core/             # 核心组件 (动态表格/表单)
├── hooks/                 # 组合式函数
├── layout/               # 布局组件
├── locales/              # 国际化配置
├── router/               # 路由配置
├── store/                # 状态管理
├── styles/               # 全局样式
├── utils/                # 工具函数
└── views/                # 页面组件
    ├── dashboard/        # 仪表盘
    ├── system/           # 系统管理
    └── ...

💼 业务开发流程

1. 页面开发规范

1.1 页面文件组织

views/
└── 业务模块名/
    └── 页面名称/
        ├── index.vue          # 页面主文件
        ├── components/        # 页面专用组件
        │   ├── EditModal.vue
        │   └── DetailDrawer.vue
        └── hooks/            # 页面专用逻辑
            └── useTableData.ts

1.2 页面组件模板

<template>
  <div class="page-container">
    <div class="page-header">
      <h1>{{ title }}</h1>
    </div>
    <div class="page-content">
      <!-- 页面内容 -->
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs, onMounted } from 'vue'

export default defineComponent({
  name: 'PageName',
  setup() {
    // 响应式数据
    const state = reactive({
      title: '页面标题',
      loading: false,
      dataSource: [],
    })

    // 业务方法
    const methods = {
      /**
       * 初始化页面数据
       */
      async initData() {
        state.loading = true
        try {
          // 数据加载逻辑
        }
        finally {
          state.loading = false
        }
      },

      /**
       * 处理用户操作
       */
      handleAction() {
        // 操作逻辑
      },
    }

    // 生命周期
    onMounted(() => {
      methods.initData()
    })

    return {
      ...toRefs(state),
      ...methods,
    }
  },
})
</script>

<style lang="less" scoped>
.page-container {
  @apply p-4;
}

.page-header {
  @apply mb-4 pb-4 border-b border-gray-200;
}

.page-content {
  @apply bg-white rounded-lg p-4;
}
</style>

2. 组件开发规范

2.1 组件分类

  • 基础组件 (components/basic/): 通用 UI 组件,无业务逻辑
  • 业务组件 (components/business/): 包含特定业务逻辑的组件
  • 页面组件 (views/*/components/): 页面专用组件

2.2 组件开发原则

  • 单一职责: 每个组件只负责一个功能
  • 数据操作内化: API 调用和数据处理在组件内部完成
  • UI 反馈内化: 消息提示、确认框等与业务操作一起处理
  • 事件通信简化: 减少复杂数据传递,优先使用简单通知机制

2.3 组件目录结构

components/basic/组件名/
├── index.vue              # 组件主文件
├── types.ts              # 类型定义
├── hooks/                # 组件专用逻辑
│   └── useComponentLogic.ts
└── __tests__/            # 单元测试
    └── index.test.ts

3. API 接口开发

3.1 接口定义

// api/demo/user.ts
import { request } from '@/utils/request'

export interface UserInfo {
  id: number
  name: string
  email: string
}

export interface UserListParams {
  page: number
  pageSize: number
  keyword?: string
}

/**
 * 获取用户列表
 */
export function getUserList(params: UserListParams) {
  return request<UserInfo[]>({
    url: '/api/users',
    method: 'GET',
    params,
  })
}

/**
 * 创建用户
 */
export function createUser(data: Omit<UserInfo, 'id'>) {
  return request<UserInfo>({
    url: '/api/users',
    method: 'POST',
    data,
  })
}

3.2 接口调用规范

// 在组件中使用
import { message } from 'ant-design-vue'
import { createUser, getUserList } from '@/api/demo/user'

const methods = {
  /**
   * 加载用户数据
   */
  async loadUsers() {
    try {
      state.loading = true
      const response = await getUserList({
        page: state.pagination.current,
        pageSize: state.pagination.pageSize,
        keyword: state.searchKeyword,
      })
      state.dataSource = response.data
      state.pagination.total = response.total
    }
    catch (error) {
      message.error('加载用户数据失败')
      console.error('Load users error:', error)
    }
    finally {
      state.loading = false
    }
  },

  /**
   * 创建用户
   */
  async handleCreateUser(userData: Omit<UserInfo, 'id'>) {
    try {
      await createUser(userData)
      message.success('用户创建成功')
      // 刷新列表
      await methods.loadUsers()
    }
    catch (error) {
      message.error('用户创建失败')
      throw error // 让调用方处理错误
    }
  },
}

4. 状态管理

4.1 Store 模块定义

// store/modules/user.ts
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null as UserInfo | null,
    permissions: [] as string[],
    token: '',
  }),

  getters: {
    isLoggedIn: state => !!state.token,
    hasPermission: state => (permission: string) =>
      state.permissions.includes(permission),
  },

  actions: {
    /**
     * 用户登录
     */
    async login(credentials: LoginParams) {
      const response = await loginApi(credentials)
      this.token = response.token
      this.userInfo = response.userInfo
      this.permissions = response.permissions
      return response
    },

    /**
     * 用户登出
     */
    logout() {
      this.token = ''
      this.userInfo = null
      this.permissions = []
    },
  },

  persist: {
    key: 'user-store',
    storage: localStorage,
    paths: ['token', 'userInfo'],
  },
})

⚠️ 开发注意事项

1. 代码规范

  • 命名规范: 使用 camelCase 命名变量和函数,PascalCase 命名组件和类
  • 文件命名: 组件文件使用 PascalCase,其他文件使用 kebab-case
  • 注释规范: 所有函数必须添加 JSDoc 注释说明功能、参数和返回值
  • 类型定义: 严格使用 TypeScript,避免使用 any 类型

2. 性能优化

  • 组件懒加载: 路由组件使用动态导入
  • 列表虚拟化: 大数据量列表使用虚拟滚动
  • 图片优化: 使用 WebP 格式,添加懒加载
  • 缓存策略: 合理使用 keep-alive 缓存页面

3. 样式开发

  • 优先使用 UnoCSS: 原子化 CSS 类,提高开发效率
  • 组件样式隔离: 使用 scoped 避免样式污染
  • 响应式设计: 使用 UnoCSS 响应式前缀适配不同屏幕
  • 主题变量: 使用 CSS 变量支持主题切换

4. 错误处理

  • 统一错误处理: 在 request 拦截器中处理通用错误
  • 用户友好提示: 使用 message 组件显示操作结果
  • 错误边界: 使用 ErrorBoundary 组件捕获组件错误
  • 日志记录: 重要操作添加日志记录

5. 安全注意事项

  • XSS 防护: 用户输入内容进行转义处理
  • CSRF 防护: API 请求携带 CSRF Token
  • 权限校验: 前端路由和后端接口都要进行权限校验
  • 敏感信息: 不在前端存储敏感信息

🔧 开发工具配置

VSCode 推荐插件

  • Vue Language Features (Volar)
  • TypeScript Vue Plugin (Volar)
  • ESLint
  • Prettier
  • UnoCSS
  • Auto Rename Tag
  • Bracket Pair Colorizer

开发命令

# 代码检查
yarn lint

# 代码格式化
yarn lint:fix

# 类型检查
yarn type-check

# 清理缓存
yarn clean:cache

# 生成 API 类型
yarn openapi

📚 相关链接

🤝 贡献指南

Git 提交规范

遵循 Conventional Commits 规范:

  • feat: 新功能
  • fix: 修复问题
  • docs: 文档更新
  • style: 代码格式调整
  • refactor: 代码重构
  • perf: 性能优化
  • test: 测试相关
  • chore: 构建工具或依赖更新

开发流程

  1. Fork 项目到个人仓库
  2. 创建功能分支: git checkout -b feature/new-feature
  3. 提交代码: git commit -m 'feat: add new feature'
  4. 推送分支: git push origin feature/new-feature
  5. 创建 Pull Request

📄 许可证

MIT License


默认账号: admin / a123456

About

部署脚本上传至cos

6.82 MiB
0 forks1 stars1 branches0 TagREADMEMIT license
Language
TypeScript70%
Vue24.7%
JavaScript4.6%
Dockerfile0.1%
Others0.6%