狸花猫前端架构揭秘:Vue3+TypeScript组件化开发实践

狸花猫前端架构揭秘:Vue3+TypeScript组件化开发实践

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

狸花猫(lihua)作为一款基于SpringBoot和Vue的权限管理系统,其前端架构采用了Vue3+TypeScript的现代化技术栈,通过组件化开发实现了高效、可维护的界面构建。本文将深入剖析狸花猫前端架构的设计理念、核心技术实现及最佳实践,为开发者提供组件化开发的全景视图。

技术栈选型与架构概览

狸花猫前端基于Vue3.0和TypeScript构建,采用组件化、模块化的设计思想,结合Pinia状态管理和Vue Router路由系统,形成了清晰的三层架构:表现层(UI组件)、业务逻辑层(Pinia Stores)和数据交互层(API封装)。

核心技术栈

技术版本作用
Vue3.x前端框架核心
TypeScript4.x+类型安全保障
Pinia2.x状态管理
Vue Router4.x路由管理
Ant Design Vue3.xUI组件库
Axios1.xHTTP客户端

项目目录结构

狸花猫前端代码集中在lihua-vue目录下,采用功能模块化的组织方式:

lihua-vue/
├── src/
│   ├── components/       # 通用组件
│   ├── views/            # 页面组件
│   ├── stores/           # Pinia状态管理
│   ├── router/           # 路由配置
│   ├── api/              # API请求封装
│   ├── utils/            # 工具函数
│   ├── directive/        # 自定义指令
│   ├── static/           # 静态资源
│   └── main.ts           # 应用入口

应用入口文件src/main.ts通过createApp初始化Vue实例,并集成Pinia、Router和UI组件库:

import { createApp, defineComponent } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/reset.css'

const app = createApp(App)
app.use(createPinia())
app.use(router)
app.use(Antd)
app.mount('#app')

组件化设计与实现

狸花猫前端采用原子设计模式,将组件分为基础组件、业务组件和页面组件三级结构,通过组件组合实现复杂界面。

组件分类体系

  1. 基础组件:如iconbutton等UI元素,位于src/components/icon等目录
  2. 业务组件:如attachment-uploadtable-setting等功能组件
  3. 页面组件:如用户管理、角色管理等完整页面,位于src/views/system目录

组件封装实践

以附件上传组件src/components/attachment-upload/index.vue为例,该组件实现了文件上传、分片上传、断点续传等核心功能,通过Props实现灵活配置:

<template>
  <a-upload
    v-model:file-list="fileList"
    :action="uploadURL"
    :headers="{Authorization: authorization}"
    :before-upload="beforeUpload"
    @change="handleChange"
  >
    <a-button>
      <UploadOutlined /> 点击上传
    </a-button>
  </a-upload>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import type { UploadFile } from 'ant-design-vue'
import { getToken } from '@/utils/Token.ts'

const fileList = ref<UploadFile[]>([])
const uploadURL = ref('/api/upload')
const authorization = ref(`Bearer ${getToken()}`)

// 文件上传前校验
const beforeUpload = (file: UploadFile) => {
  // 实现文件类型、大小校验逻辑
  return true
}

// 上传状态变化处理
const handleChange = ({ file }: { file: UploadFile }) => {
  if (file.status === 'done') {
    // 上传成功处理
  }
}
</script>

该组件通过defineProps定义了丰富的配置项,支持按钮模式/拖拽模式切换、文件类型限制、分片上传等高级功能,体现了"高内聚低耦合"的设计原则。

组件通信策略

狸花猫采用多种组件通信方式,适应不同场景需求:

  1. Props/Events:父子组件通信,如attachment-upload通过v-model与父组件交互
  2. Provide/Inject:跨层级通信,如登录状态通过provide全局共享
  3. Pinia:全局状态共享,如用户信息存储在user store中
  4. 事件总线:复杂组件间通信(基于mitt实现)

状态管理与路由控制

狸花猫使用Pinia进行状态管理,结合Vue Router实现路由权限控制,构建了完整的前端权限体系。

Pinia状态管理

Pinia作为Vue3推荐的状态管理方案,在狸花猫中被广泛应用于用户信息、权限控制、字典数据等全局状态的管理。以用户状态为例,src/stores/user.ts定义了用户相关的状态和操作:

import { defineStore } from 'pinia'
import { login, logout } from '@/api/system/login/Login.ts'

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: {},
    token: '',
    roles: []
  }),
  actions: {
    async login(username: string, password: string) {
      const resp = await login(username, password)
      this.token = resp.data
      // 存储token到本地
    },
    logout() {
      this.token = ''
      this.userInfo = {}
      // 清除本地存储
    }
  }
})

系统定义了多个功能模块的Store,包括:

  • user:用户信息与认证
  • permission:权限路由管理
  • dict:字典数据缓存
  • theme:主题配置
  • viewTabs:标签页管理

路由权限控制

路由系统通过src/router/index.ts配置,结合权限控制中间件实现动态路由和权限校验:

import { createRouter, createWebHistory } from 'vue-router'
import Layout from '@/layout/index.vue'

const routes = [
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/login/index.vue')
  },
  {
    path: '/',
    component: Layout,
    children: [
      {
        path: 'index',
        name: 'AppIndex',
        component: () => import('@/views/index/index.vue'),
        meta: { 
          label: '首页', 
          icon: 'HomeOutlined',
          role: ['ROLE_admin', 'ROLE_user'] // 角色权限控制
        }
      }
    ]
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

路由守卫src/permission.ts实现了基于角色的访问控制:

router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()
  const hasToken = userStore.token
  
  if (hasToken) {
    if (to.path === '/login') {
      next('/index')
    } else {
      // 检查用户是否有权限访问目标路由
      if (hasRouteRole(to.meta.role)) {
        next()
      } else {
        next('/403')
      }
    }
  } else {
    next('/login')
  }
})

高级特性与最佳实践

狸花猫前端架构融合了多项Vue3+TypeScript的高级特性,通过工程化手段提升开发效率和代码质量。

Composition API与Script Setup

项目全面采用Vue3的Composition API,结合<script setup>语法糖简化组件代码:

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

// 响应式状态
const count = ref(0)
const user = reactive({ name: '', age: 0 })

// 生命周期钩子
onMounted(() => {
  // 初始化逻辑
})

// 方法定义
const increment = () => {
  count.value++
}
</script>

src/views/monitor/server/MonitorServer.vue等页面组件中,大量使用refreactive等API组织响应式状态,通过组合函数抽取复用逻辑。

自定义指令扩展

狸花猫通过自定义指令实现了权限控制、防抖节流等通用功能,定义在src/directive/目录:

// src/directive/HasPermission.ts
import type { App } from 'vue'
import { useUserStore } from '@/stores/user'

export const hasPermission = {
  mounted(el: HTMLElement, binding: any) {
    const { permissions } = useUserStore()
    const { value } = binding
    if (!permissions.includes(value)) {
      el.parentNode?.removeChild(el)
    }
  }
}

export default function install(app: App) {
  app.directive('hasPermission', hasPermission)
}

在模板中通过v-has-permission指令控制元素显示:

<button v-has-permission="'system:user:add'">新增用户</button>

表格组件高级封装

src/components/table-setting/index.vue实现了表格列配置功能,支持列显示切换、拖拽排序、宽度调整等高级特性:

<template>
  <a-popover>
    <template #content>
      <VueDraggable v-model="tableSettings" handle=".drag">
        <div v-for="item in tableSettings" :key="item.key">
          <a-checkbox v-model:checked="item.display">{{ item.label }}</a-checkbox>
          <a-slider v-model:value="item.width" />
        </div>
      </VueDraggable>
    </template>
    <a-button><SettingOutlined /></a-button>
  </a-popover>
</template>

该组件通过VueDraggable实现拖拽排序,结合localStorage保存用户配置,提供了个性化的表格体验。

实战案例:字典管理模块

以字典管理模块src/views/system/dict/SystemDict.vue为例,展示狸花猫组件化开发的完整流程:

页面结构

<template>
  <div>
    <!-- 搜索区域 -->
    <a-card>
      <a-form :model="queryParams">
        <a-row :gutter="16">
          <a-col :span="6">
            <a-input v-model:value="queryParams.name" placeholder="字典名称" />
          </a-col>
          <a-col :span="6">
            <a-button type="primary" @click="handleQuery">查询</a-button>
          </a-col>
        </a-row>
      </a-form>
    </a-card>

    <!-- 表格区域 -->
    <a-table
      :data-source="dictList"
      :columns="columns"
      :pagination="pagination"
    >
      <template #bodyCell="{ column, record }">
        <template v-if="column.key === 'action'">
          <a-button @click="handleEdit(record)">编辑</a-button>
        </template>
      </template>
    </a-table>

    <!-- 字典配置抽屉 -->
    <a-drawer v-model:open="drawerOpen">
      <dict-data :type-code="currentDictCode" />
    </a-drawer>
  </div>
</template>

逻辑实现

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { queryPage, deleteData } from '@/api/system/dict/DictType.ts'
import DictData from './dictData/index.vue'

// 状态定义
const dictList = ref([])
const queryParams = ref({ name: '', code: '' })
const pagination = ref({ current: 1, pageSize: 10, total: 0 })

// 生命周期
onMounted(() => {
  handleQuery()
})

// 方法定义
const handleQuery = async () => {
  const resp = await queryPage({
    ...queryParams.value,
    pageNum: pagination.value.current,
    pageSize: pagination.value.pageSize
  })
  dictList.value = resp.data.records
  pagination.value.total = resp.data.total
}

const handleEdit = (record) => {
  // 编辑逻辑
}
</script>

该页面通过组合API组织业务逻辑,使用Ant Design Vue组件构建界面,通过API模块与后端交互,体现了组件化、模块化的设计思想。

架构优化与性能调优

狸花猫前端在架构设计中融入了多项性能优化策略,确保系统高效运行。

按需加载与代码分割

通过Vue Router的动态导入功能实现路由级别的代码分割:

// src/router/index.ts
const routes = [
  {
    path: '/system/user',
    name: 'SystemUser',
    component: () => import('@/views/system/user/SystemUser.vue')
  }
]

图片资源优化

项目静态图片集中在src/assets/images/目录,通过SVG图标和图片懒加载减少资源加载:

<template>
  <img v-for="img in imageList" :src="img.src" loading="lazy" />
</template>

<script setup lang="ts">
const imageList = [
  { src: new URL('@/assets/images/miao-1.jpg', import.meta.url).href },
  // 更多图片...
]
</script>

系统首页展示了多张狸花猫图片,如:

狸花猫图片1 狸花猫图片2

大数据渲染优化

对于表格等大数据场景,采用虚拟滚动、分页加载等策略提升性能:

<a-table
  :data-source="dataSource"
  :columns="columns"
  :pagination="{ pageSize: 100 }"
  :scroll="{ y: 600 }"
/>

总结与展望

狸花猫前端架构基于Vue3+TypeScript构建了一套完整的组件化开发体系,通过合理的目录结构、封装复用的组件设计、严格的类型检查和高效的状态管理,实现了权限管理系统的复杂需求。核心优势体现在:

  1. 组件化设计:原子化组件拆分,提高代码复用率
  2. 类型安全:TypeScript全流程覆盖,减少运行时错误
  3. 权限精细控制:基于路由和指令的双层权限校验
  4. 用户体验优化:表格配置、主题切换等个性化功能
  5. 性能优化:按需加载、缓存策略提升系统响应速度

未来,狸花猫前端架构可在以下方向持续优化:

  • 引入Vite提升构建速度
  • 探索微前端架构支持多应用集成
  • 加强组件单元测试覆盖
  • 优化移动端适配体验

通过本文的深入剖析,希望能为开发者提供Vue3组件化开发的实践参考,助力构建更优质的前端应用。完整代码可参考项目仓库结构,进一步探索各模块实现细节。

官方文档:README.md 前端源码:lihua-vue/ 组件示例:src/components/

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值