Vue 3 搭建前端模板并集成 Ant Design Vue(2025)

一、环境安装

截止2025.2.6 ,官网发布的vue 3 稳定版本是 V 3.5.13

根据此时的官方文档要求,node 版本需要大于等于 V 18.3

于是使用 nvm 安装 v 20.18.0

二、创建项目

使用 Vue 官方推荐的脚手架 create-vue 快速创建 Vue3 的项目:

快速上手 | Vue.js

在终端中输入命令: npm create vue@latest  但若后续文档升级还想创建现在版本的框架的话,输入 npm create vue@3.12.1

接下来按照如下选项创建项目,脚手架会自动帮我们安装 Vue Router 路由、Pinia 全局状态管理等实用类库 :

然后用 Webstorm 打开项目,先在终端执行 npm install 安装依赖,然后执行 npm run dev
能访问网页就成功了。

运行项目之后,会发现Vue 脚手架提供了一个调试工具 devtools(http://localhost:5173/devtools/),可以使用它来调试分析项目 :

三、前端工程化配置

脚手架已经帮我们整合了 Prettier 代码美化、ESLint 自动校验、TypeScript 类型校验,无需再自行整合。但是需要在 webstorm 里开启代码美化插件 : 

在 vue 文件中执行格式化快捷键,不报错,表示配置工程化成功。如果发现格式化效果不好,也没关系,之后可以使用另外一种格式化快捷键

 修改 eslint.config.js、.prettierrc.json、tsconfig.json 文件可以改变校验规则。如果不使用脚手架,就需要自己整合这些工具:

代码规范:https://eslint.org/docs/latest/use/getting-started
代码美化:https://prettier.io/docs/en/install.htm!
直接整合:https://github.com/prettier/eslint-plugin-prettier#recommended-configuration(包括https://github.com/prettier/eslint-config-prettier#installation)

对于前端新手来说,不需要深入了解这些,纯当工具去使用即可,尽快上手项目。 

四、引入组件库

引入 Ant Design Vue 组件库,参考 官方文档 快速上手 - Ant Design Vue 快速上手。
注意,本教程使用的是 v4.2.6 的组件库版本,如果后续阅读本教程中发现有组件或语法不一致,以官方文档为主,或者在网站右上角切换对应版本的文档即可:

执行命令:

npm i --save ant-design-vue@4.x

改变主入口文件 main.ts,全局注册组件((为了方便) 

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(Antd);
app.use(createPinia())
app.use(router)

app.mount('#app')

然后在 App.vue 中增加一个按钮组件,测试 Ant Design Vue 组件是否安装成功。

五、选择 API 风格

1、选项式 API (Options API)​

使用选项式 API,可以用包含多个选项的对象来描述组件的逻辑,例如 data,methods 和 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例。

<script>
export default {
  // data() 返回的属性将会成为响应式的状态
  // 并且暴露在 `this` 上
  data() {
    return {
      count: 0
    }
  },
  // methods 是一些用来更改状态与触发更新的函数
  // 它们可以在模板中作为事件处理器绑定
  methods: {
    increment() {
      this.count++
    }
  },
  // 生命周期钩子会在组件生命周期的各个不同阶段被调用
  // 例如这个函数就会在组件挂载完成后被调用
  mounted() {
    console.log(`The initial count is ${this.count}.`)
  }
}
</script>
<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

2、组合式 API (Composition API)​

通过组合式 API,可以使用导入的 API 函数来描述组件逻辑。在单文件组件中,组合式 API 通常会与 <script setup> 搭配使用。这个 setup attribute 是一个标识,告诉 Vue 需要在编译时进行一些处理,让我们可以更简洁地使用组合式 API。比如,<script setup> 中的导入和顶层变量/函数都能够在模板中直接使用。

下面是使用了组合式 API 与 <script setup> 改造后和上面的模板完全一样的组件:

<script setup>
import { ref, onMounted } from 'vue'

// 响应式状态
const count = ref(0)

// 用来修改状态、触发更新的函数
function increment() {
  count.value++
}

// 生命周期钩子
onMounted(() => {
  console.log(`The initial count is ${count.value}.`)
})
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

建议遵循 Vue3 的组合式 API(Composition API),而不是 选项式 AP!,开发更自由高效一些。

六、页面信息修改

修改 html 文件中的 title 和 ico 部分,设置成适合自己项目的信息:

<!DOCTYPE html>
<html lang="">
<head>
    <meta charset="UTF-8">
    <link rel="icon" href="/bitbug_favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智能云图库平台</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

还可以替换 public 目录下默认的 ico 图标为自己的,有很多 现成的网站(如:在线制作ico图标 | 在线ico图标转换工具 方便制作favicon.ico - 比特虫 - Bitbug.net) 可以制作 ico 图标。效果如图:

七、通用布局选择

1、基础布局结构

在 layouts 日录下新建一个布局 BasicLayout.vue,在 App.vue 全局页面入口文件中引入。App.vue 代码如下 : 

<template>
  <div id="app">
    <BasicLayout/>
  </div>
</template>

<script lang="ts" setup>
import BasicLayout from "@/layouts/BasicLayout.vue";
</script>

可以移除页面内的默认样式、并且移除 main.ts 中默认引入的 main.css,防止样式污染 : 

<style>
#app {
}
</style>

选用 Ant Design 组件库的 Layout 组件 布局 Layout - Ant Design Vue,先把【上中下】布局编排好,然后再填充内容 : 

<template>
  <div id="basicLayout">
    <a-layout style="min-height: 100vh">
      <a-layout-header>Header</a-layout-header>
      <a-layout-content>Content</a-layout-content>
      <a-layout-footer>Footer</a-layout-footer>
    </a-layout>
  </div>
</template>

<script setup lang="ts"></script>

<style scoped>
#basicLayout {
}
</style>

并且移除脚手架自带的样式 ,这些都用不上。

 

2、全局底部栏 

通常用于展示版权信息 :  

<a-layout-footer class="footer">
  <a href="https://www.baidu.com" target="_blank"> 
    智能云图库 by Asukabai
  </a>
</a-layout-footer>

#basicLayout .footer {
  background: #efefef;
  padding: 16px;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  text-align: center;
}

3、动态替换内容

项目使用了 Vue Router 路由库 介绍 | Vue Router,可以在 router/index.ts 配置路由,能够根据访问的页面地址找到不同的文件并加载渲染。(比如,此处当路由是 / 时 ,加载的组件是 HomeView , 而 HomeView 组件中又加载了 TheWelcome 于是   <router-view /> 将会把 TheWelcome 的内容显示出来 )

于是,修改 BasicLayout 内容部分的代码如下 : 

<a-layout-content class="content">
  <router-view />
</a-layout-content>

修改样式,要和底部栏保持一定的外边距,否则内容会被遮住 :

<style scoped>
#basicLayout .content {
  background: linear-gradient(to right, #fefefe, #fff);
  margin-bottom: 28px;
  padding: 20px;
}
</style>

 修改之后,发现即使页面拉倒底,也不会有内容被 footer 所挡住 :

 

4、全局顶部栏 

由于顶部栏的开发相对复杂,可以基于 Ant Design 的菜单组件 导航菜单 Menu - Ant Design Vue来创建 GlobalHeader 全局顶部栏组件,组件统一放在 components 日录中  。先直接复制现成的组件示例代码到 GlobalHeader 中即可 (此处选择了“水平的顶部导航菜单”)

在基础布局中引入顶部栏组件 : 

<a-layout-header class="header">
  <GlobalHeader />
</a-layout-header>

效果如下 :
样式代码如下:可以修改下全局 Header 的样式,清除一些默认样式(比如背景色等)

接下来要修改 GlobalHeader 组件,完善更多内容。
1) 给菜单外套一层元素,用于整体控制样式 :

<div id="globalHeader">
  <a-menu v-model:selectedKeys="current" mode="horizontal" :items="items" />
</div>

2) 根据我们的需求修改菜单配置,key 为要跳转的 URL 路径, 并且在组件中选择 icon 切换自己想要的图标:

<script lang="ts" setup>
import { h, ref } from 'vue'
import { HomeOutlined } from '@ant-design/icons-vue'
import { MenuProps } from 'ant-design-vue'

const current = ref<string[]>(['home'])
const items = ref<MenuProps['items']>([
  {
    key: '/',
    icon: () => h(HomeOutlined),
    label: '主页',
    title: '主页',
  },
  {
    key: '/about',
    label: '关于',
    title: '关于',
  },
  {
    key: 'others',
    label: h('a', { href: 'https://www.baidu.com', target: '_blank' }, '百度一下'),
    title: '百度一下',
  },
])
</script>

效果如图:


3) 完善全局顶部栏,左侧补充网站图标和标题。

<RouterLink to="/">
  <div class="title-bar">
    <img class="logo" src="../assets/logo.png" alt="logo" />
    <div class="title">智能云图库</div>
  </div>
</RouterLink>


先把 logo.png 放到 src/assets 日录下,替换掉原本的默认 Logo:修改 GlobalHeader 代码,补充 HTML:

其中,RouterLink 组件的作用是支持超链接跳转(不刷新页面)
补充 CSS 样式

4)完善顶部导航栏,右侧展示当前用户的登录状态(暂时用登录按钮代替)

5)优化导航栏的布局,采用 栅格组件的自适应布局(左中右结构,左侧右侧宽度固定,中间菜单栏自适应)

效果如图,可以尝试缩小浏览器窗口观察导航条的变化:
路由
目标:点击菜单项后,可以跳转到对应的页面;并且刷新页面后,对应的菜单自动高亮。
修改路由配置
按需修改 router/index.ts 文件的 routes 配置,定义我们需要的页面路出,每个 path 对应一个component (要加载的组件)

观察上述代码,会发现 component 支持直接传入组件、或者使用 impor 按需懒加载组件,按需加载是一种优化首次打开站点性能的方式 。
2、路由跳转
给 GlobalHeader 的菜单组件绑定跳转事件 :

修改 HTML 模板,绑定事件 :

3、高亮同步
刷新页面后,你会发现当前菜单项并没有高亮,所以需要同步路由的更新到菜单项高亮
同步高亮原理:
1.点击菜单时,Ant Design 组件已经通过 v-model 绑定 current 变量实现了高亮。
2.刷新页面时,需要获取到当前 URL 路径,然后修改 current 变量的值,从而实现同步。
使用 Vue Router 的 afterEach 路由钩子实现,每次改变路由或刷新页面时都会自动更新 current 的值,从而实现高亮:

?思考:大家有没有发现,路由和菜单配置中,有一些是重复的呢?有没有更好地方式来配置路由和菜单项,不用每次修改时都要改两边的代码呢?答案就是将路由配置数组传递给菜单组件

八、引入 Axios 请求库


一般情况下,前端只负责界面展示和动效交互,尽量避免写复杂的逻辑;当需要获取数据时,通常是向后端提供的接口发送请求,由后端执行操作(比如保存数据)并响应数据给前端。
前端如何向后端发送请求呢?最传统的方式是使用 AJAX 技术。但其代码有些复杂,我们可以使用第三方的封装库,来简化发送请求的代码,比如主流的请求工具库 Axios。
1、请求工具库
安装请求工具类 Axios,参考官方文档:https://axios-http.com/docs/intro

npm install axios

2、全局自定义请求
需要自定义全局请求地址等,参考 Axios 官方文档,编写请求配置文件 request.ts 。包括全局接口请求地址、超时时间、自定义请求响应拦截器等。
响应拦截器的应用场景:我们需要对接口的 通用响应 进行统一处理,比如从 response 中取出 data;或者根据 code 去集中处理错误。这样不用在每个接口请求中都去写相同的逻辑。比如可以在全局响应拦截器中,读取出结果中的 data,并校验 code 是否合法,如果是未登录状态,则自动登录。示例代码如下,其中 withcredentials:true 一定要写,否则无法在发请求时携带 Cookie,就无法完成登录。
代码如下:

import axios from 'axios'
import { message } from 'ant-design-vue'

// 创建 Axios 实例
const myAxios = axios.create({
  baseURL: 'http://localhost:8123',
  timeout: 60000,
  withCredentials: true,
})

// 全局请求拦截器
myAxios.interceptors.request.use(
  function (config) {
    // Do something before request is sent
    return config
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error)
  },
)

// 全局响应拦截器
myAxios.interceptors.response.use(
  function (response) {
    const { data } = response
    // 未登录
    if (data.code === 40100) {
      // 不是获取用户信息的请求,并且用户目前不是已经在用户登录页面,则跳转到登录页面
      if (
        !response.request.responseURL.includes('user/get/login') &&
        !window.location.pathname.includes('/user/login')
      ) {
        message.warning('请先登录')
        window.location.href = `/user/login?redirect=${window.location.href}`
      }
    }
    return response
  },
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    return Promise.reject(error)
  },
)

export default myAxios

3、自动生成请求代码
如果采用传统开发方式,针对每个请求都要单独编写代码,很麻烦。推荐使用 OpenAP| 工具,直接自动生成即可:https://www.npmjs.com/package/@umijs/openapi按照官方文档的步骤,先安装:

npm i --save-dev @umijs/openapi

openapi.config.js ,根据自己的需要定制生成的代码:
在 **项目根目录 **新建

import { generateService } from '@umijs/openapi'

generateService({
  requestLibPath: "import request from '@/request'",
  schemaPath: 'http://localhost:8123/api/v2/api-docs',
  serversPath: './src',
})

 注意,要将 schemaPath 改为自己后端服务提供的 Swagger 接口文档的地址。
在package.json的script 中添加"openapi":"node openapi.config.js"
执行即可生成请求代码,还包括 TypeScript 类型:

以后每次后端接口变更时,只需要重新生成一遍就好,非常方便~
4、测试请求
可以尝试在任意页面代码中调用 AP1:

import { healthUsingGet } from '@/api/mainController'

healthUsingGet().then((res) => {
  console.log(res)
})

按 F12 打开开发者工具查看请求,由于我们后端已经添加了全局跨域配置,正常情况下应该能看到如下响应 :

解决跨域 (可选)
如果发现请求错误,要查看错误信息具体分析。比如遇到跨域问题,这是由于前端网页地址和后端请求接口地址不同导致的 :

这种情况下,可以通过修改后端代码,增加全局跨域配置或者跨域注解来解决

nfig.ts 文件,增加代理配置 :
如果后端代码无法修改,还可以通过前端代理服务器来解决,如果项目使用 Vite,内置了代理服务器。可以修改 vite.config.ts 文件,增加代理配置 :

export default defineConfig({
  server: {
    proxy: {
      '/api': 'http://localhost:8123',
    }
  },
})

同时修改 request.ts,移除请求前缀 :

扩展


在后续开发中你会发现,Ant Design Vue 默认使用的是英文文案,如果需要替换为中文,可以参考 国际化文档,只需给整个应用包裹一层组件即可完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析

引言&#xff1a;接口测试的必要性 在微服务架构盛行的今天&#xff0c;SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测&#xff0c;使用OpenAPI规范打通测试全流程&#xff0c;让您的接口质量保障体系更加完备。…

android 新增native binder service 方式(三)

书接上回&#xff0c;继续第三种方式&#xff0c;是手动生成 service binder 的方法,项目结构 1&#xff0c;编译aidl aidl 文件保持不变&#xff0c;如何生成Bn和Bp 文件呢。 aidl -I ./libserviceaidl/aidl -h ./ -o ./ --langcpp libserviceaidl/aidl/com/test/IService.a…

半导体制造工艺(二)光刻工艺—掩模版

在上文中我们已经简单概述了光刻工艺的大致流程。接下来将会介绍在光刻工艺中所需用到的必备材料以及设备。例如掩模版、光刻胶、匀胶机、光刻机等等。由于需要保持讲述工艺的完整性以及流畅&#xff0c;每一个都需要涉及&#xff0c;所以每次仅是侧重点不同。此篇主要讲述的是…

【Linux】责任链模式和消息队列

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#x…

Qt开发⑨Qt的事件_事件处理_按键事件和鼠标事件

目录 1. 事件简介 2. 事件的处理 3. 键盘按键事件 3.1 单个按键 3.2 组合按键 4. 鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标移动事件 4.5 滚轮事件 5. 定时器 5.1 QTimerEvent 类 5.2 QTimer 类 6. 事件分发器 7. 事件过滤器 本…

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件&#xff0c;进入到 企业业务网站去下…

智慧校园平台在学生学习与生活中的应用

随着科技的发展&#xff0c;教育领域也在不断探索新的模式与方法。智慧校园平台作为教育信息化的重要组成部分&#xff0c;正逐渐成为推动教育改革、提高教学质量的关键工具。 一.智慧校园平台概述 智慧校园平台是一种集成了教学管理、资源服务、数据分析等多功能于一体的数字…

【软考-架构】备战2025软考

新老教材对比 科目1&#xff08;信息系统综合&#xff09;考点详解 科目2&#xff08;系统架构设计案例&#xff09;考点详解 科目3&#xff08;系统架构设计论文&#xff09;考点详解 趋于越来越具体 学习方法推荐 第一阶段 – 基础知识阶段 建议一个半月&#xff1b; 先过…

Github更新本地仓库到远程总是失败文件过大,如何解决。

环境&#xff1a; AI-Sphere-Butler 问题描述&#xff1a; Github更新本地仓库到远程总是失败文件过大&#xff0c;如何解决。 解决方案&#xff1a; 问题核心在于 历史提交中仍然存在未被 LFS 正确追踪的大文件。 终极解决方案 (必须按顺序执行) 第一步&#xff1a;修…

IP-----动态路由OSPF(2)

这只是IP的其中一块内容&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为动态路由OSPF &#xff0c;可通过以下路径查看IP-----动态路由OSPF-CSDN博客,欢迎指正 注意&#xff01;&#xff01;&#xff01;本部分内容较多所以分成了两部分在上一章 5.动态路…

Git系列之-工作区回滚

目录 前言 Git回滚工作区的代码 回滚暂存区的代码 回滚Commit本地分支后的代码 git push把修改提交到远程仓库 归属系列&#xff1a; 前言 本文旨在描述Git中各种回退操作。 Git回滚工作区的代码 前提&#xff1a;当前工作区未进行暂存操作。 git checkout -- a.txt …

汽车悬架系统技术演进:从被动到全主动的革新之路(主动悬架类型对比)

在汽车工业的百年发展史中&#xff0c;悬架系统始终是平衡车辆性能与舒适性的关键战场。随着消费者对驾乘体验要求的不断提升&#xff0c;传统被动悬架已难以满足中高端车型的需求&#xff0c;而半主动与全主动悬架技术的崛起&#xff0c;正在重塑行业格局。本文将深入解析三大…

快速理解Spring 和 Spring Boot 的核心区别

1. 定位与目标 Spring Framework 定位&#xff1a;一个以解耦和模块化为核心的企业级 Java 开发框架&#xff0c;提供 IOC&#xff08;控制反转&#xff09;、AOP&#xff08;面向切面编程&#xff09; 等基础功能。解决的问题&#xff1a;通过依赖注入和模块化设计简化复杂的企…

【JavaSE-1】初识Java

1、Java 是什么? Java 是一种优秀的程序设计语言,人类和计算机之间的交流可以借助 Java 这种语言来进行交流,就像人与人之间可以用中文、英语,日语等进行交流一样。 Java 和 JavaScript 两者有关系吗? 一点都没有关系!!! 前端内容:HTML CSS JS,称为网页三剑客 2、JDK 下…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…

Win10环境借助DockerDesktop部署单节点Redis6

Win10环境借助DockerDesktop部署单节点Redis6 前言 在后端和大数据开发中&#xff0c;Redis是非常常见的一个组件&#xff0c;常用作KV键值对存储及分布式锁或缓存加速。 之前笔者使用Win版Redis实现了本地部署&#xff1a; https://lizhiyong.blog.csdn.net/article/detai…

【AIGC系列】3:Stable Diffusion模型原理介绍

目录 1 前言2 基础概念2.1 Latent space2.2 AutoEncoder2.3 VAE2.4 扩散模型2.5 多模态交叉注意力 3 Stable Diffusion原理4 整体框架4.1 文生图4.2 图生图4.3 修复 1 前言 Stable diffusion是一个基于 Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&…