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

目錄

一、環境安裝

二、創建項目

三、前端工程化配置

四、引入組件庫

五、選擇 API 風格

1、選項式 API (Options API)?

2、組合式 API (Composition API)?

六、頁面信息修改

七、通用布局選擇

1、基礎布局結構

2、全局底部欄?

3、動態替換內容

4、全局頂部欄?

八、引入 Axios 請求庫

1、請求工具庫

2、全局自定義請求

3、自動生成請求代碼

4、測試請求?

補充:

一、環境安裝

截止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) 完善全局頂部欄,左側補充網站圖標和標題。

????????先把 logo.png 放到 src/assets 日錄下,替換掉原本的默認 Logo : 修改 GlobalHeader 代碼,補充 HTML :

<RouterLink to="/"><div class="title-bar"><img class="logo" src="../assets/logo.png" alt="logo" /><div class="title">魚皮云圖庫</div></div>
</RouterLink>

其中,RouterLink 組件的作用是支持超鏈接跳轉(不刷新頁面) ,補充 CSS 樣式?:

<style scoped>
.title-bar {display: flex;align-items: center;
}.title {color: black;font-size: 18px;margin-left: 16px;
}.logo {height: 48px;
}
</style>

得到的效果如圖所示 :?

4) 完善頂部導航欄,右側展示當前用戶的登錄狀態 (暫時用登錄按鈕代替)

<div class="user-login-status"><a-button type="primary" href="/user/login">登錄</a-button>
</div>

5) 優化導航欄的布局,采用 柵格組件 的自適應布局 (左中右結構,左側右側寬度固定,中間菜單欄自適應)

<a-row :wrap="false"><a-col flex="200px"><RouterLink to="/"><div class="title-bar"><img class="logo" src="../assets/logo.png" alt="logo" /><div class="title">智能云圖庫</div></div></RouterLink></a-col><a-col flex="auto"><a-menuv-model:selectedKeys="current"mode="horizontal":items="items"/></a-col><a-col flex="120px"><div class="user-login-status"><a-button type="primary" href="/user/login">登錄</a-button></div></a-col>
</a-row>

效果如圖,可以嘗試縮小瀏覽器窗口觀察導航條的變化:


6) 修改路由配置,?目標: 點擊菜單項后,可以跳轉到對應的頁面;并且刷新頁面后,對應的菜單自動高亮。按需修改 router/index.ts 文件的 routes 配置,定義我們需要的頁面路出,每個 path 對應一個component (要加載的組件)?

routes: [{path: '/',name: 'home',component: HomeView,},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (About.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import('../views/AboutView.vue'),},
],

????????觀察上述代碼,會發現 component 支持直接傳入組件、或者使用 impor 按需懶加載組件,按需加載是一種優化首次打開站點性能的方式 。路由跳轉:? 給 GlobalHeader 的菜單組件綁定跳轉事件 :

import { useRouter } from "vue-router";
const router = useRouter();// 路由跳轉事件
const doMenuClick = ({ key }: { key: string }) => {router.push({path: key,});
};

修改 HTML 模板,綁定事件 :

<a-menuv-model:selectedKeys="current"mode="horizontal":items="items"@click="doMenuClick"
/>

刷新頁面后,你會發現當前菜單項并沒有高亮,所以需要同步路由的更新到菜單項高亮
同步高亮原理:
1.點擊菜單時,Ant Design 組件已經通過 v-model 綁定 current 變量實現了高亮。
2.刷新頁面時,需要獲取到當前 URL 路徑,然后修改 current 變量的值,從而實現同步。
使用 Vue Router 的 afterEach 路由鉤子實現,每次改變路由或刷新頁面時都會自動更新 current 的值,從而實現高亮:

const router = useRouter();
// 當前選中菜單
const current = ref<string[]>([]);
// 監聽路由變化,更新當前選中菜單
router.afterEach((to, from, next) => {current.value = [to.path];
});

????????但目前 路由和菜單配置中,有一些是重復的? 有沒有更好地方式來配置路由和菜單項,不用每次修改時都要改兩邊的代碼呢?? ( 答案就是將路由配置數組傳遞給菜單組件 )

八、引入 Axios 請求庫

????????一般情況下,前端只負責界面展示和動效交互,盡量避免寫復雜的邏輯;當需要獲取數據時,通常是向后端提供的接口發送請求,由后端執行操作(比如保存數據)并響應數據給前端。
????????前端如何向后端發送請求呢?最傳統的方式是使用 AJAX 技術。但其代碼有些復雜,我們可以使用第三方的封裝庫,來簡化發送請求的代碼,比如主流的請求工具庫 Axios。

1、請求工具庫

安裝請求工具類 Axios,參考官方文檔: https://axios-http.com/docs/intro?Getting Started |?Axios Docs

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 sentreturn config},function (error) {// Do something with request errorreturn 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 errorreturn 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 類型:

如果生成過程中出現,環境沒裝,根據提示安裝即可

如此處執行?npm install tslib --save-dev 即可,以后每次后端接口變更時,只需要重新生成一遍就好,非常方便?

4、測試請求?

可以嘗試在任意頁面代碼中調用 AP1 :

import { healthUsingGet } from '@/api/mainController'healthUsingGet().then((res) => {console.log(res)
})

按 F12 打開開發者工具查看請求,由于我們后端已經添加了全局跨域配置,正常情況下應該能看到如下響應 :

解決跨域 (可選)
如果發現請求錯誤,要查看錯誤信息具體分析。比如遇到跨域問題,這是由于前端網頁地址和后端請求接口地址不同導致的 :

這種情況下,可以通過修改后端代碼,增加全局跨域配置或者跨域注解來解決,如果后端代碼無法修改,還可以通過前端代理服務器來解決,如果項目使用 Vite,內置了代理服務器。可以修改 vite.config.ts 文件,增加代理配置 :

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

同時修改 request.ts,移除請求前綴 :

// 創建 Axios 實例
const myAxios = axios.create({baseURL: '',timeout: 60000,withCredentials: true,
})

????????這樣一來,前端發送的請求域名就等同于當前 URL 的域名,就不會出現跨域。但是訪問到 /api開頭的接口時,會被代理到請求 8123 端口的后端服務器,從而完成請求。當然,前端還有很多代理工具,比如 Whistle 。?

補充:

在后續開發中你會發現,Ant Design Vue 默認使用的是英文文案,如果需要替換為中文,可以參考 國際化文檔,只需給整個應用包裹一層組件即可完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++雜記——RTTI

run-time type information or run-time type identification (RTTI) RTTI&#xff08;Runtime Type Information&#xff09;是C中的一個特性&#xff0c;允許程序在運行時獲取類型信息。它主要用于多態&#xff08;尤其是基于類的多態&#xff09;時&#xff0c;幫助判斷對象…

【Mac】git使用再學習

目錄 前言 如何使用github建立自己的代碼庫 第一步&#xff1a;建立本地git與遠程github的聯系 生成密鑰 將密鑰加入github 第二步&#xff1a;創建github倉庫并clone到本地 第三步&#xff1a;上傳文件 常見的git命令 git commit git branch git merge/git rebase …

六十天前端強化訓練之第七天CSS預處理器(Sass)案例:變量與嵌套系統詳解

歡迎來到編程星辰海的博客講解 目錄 一、知識講解&#xff08;3000字&#xff09; 1. Sass基礎概念 2. 變量系統 2.1 變量定義 2.2 數據類型 2.3 作用域優先級 2.4 變量實踐場景 3. 嵌套系統 3.1 選擇器嵌套 3.2 屬性嵌套 3.3 嵌套規則 二、核心代碼示例 完整SCSS…

Docker和K8S中pod、services、container的介紹和關系

在容器化技術中&#xff0c;Docker、Kubernetes&#xff08;K8S&#xff09;、Pod、Service 和 Container 是核心概念&#xff0c;理解它們的關系對構建和管理現代應用至關重要。以下是詳細的分步解釋&#xff1a; 1. 核心概念定義 (1) Container&#xff08;容器&#xff09;…

DeepSeek掘金——DeepSeek R1驅動的PDF機器人

DeepSeek掘金——DeepSeek R1驅動的PDF機器人 本指南將引導你使用DeepSeek R1 + RAG構建一個功能性的PDF聊天機器人。逐步學習如何增強AI檢索能力,并創建一個能夠高效處理和響應文檔查詢的智能聊天機器人。 本指南將引導你使用DeepSeek R1 + RAG構建一個功能性的PDF聊天機器人…

基于 ?MySQL 數據庫?對三級視圖(用戶視圖、DBA視圖、內部視圖)的詳細解釋

基于 ?MySQL 數據庫?對三級視圖&#xff08;用戶視圖、DBA視圖、內部視圖&#xff09;的詳細解釋&#xff0c;結合理論與實際操作說明&#xff1a; 一、三級視圖核心概念 數據庫的三級視圖是 ANSI/SPARC 體系結構的核心思想&#xff0c;MySQL 的實現邏輯如下&#xff1a; …

WP 高級摘要插件:助力 WordPress 文章摘要精準自定義顯示

wordpress插件介紹 “WP高級摘要插件”功能豐富&#xff0c;它允許用戶在WordPress后臺自定義文章摘要。 可設置摘要長度&#xff0c;靈活調整展示字數&#xff1b;設定摘要最后的顯示字符&#xff0c; 如常用的省略號等以提示內容未完整展示&#xff1b;指定允許在摘要中顯示…

三次握手內部實現原理

socket()創建一個新的套接字 int socket(int domain, int type, int protocol)&#xff1b; 參數&#xff1a; domain&#xff1a;地址族&#xff0c;如 AF_INET&#xff08;IPv4&#xff09;&#xff0c;AF_INET6&#xff08;IPv6&#xff09; type&#xff1a;套接字類型&…

DeepSeek 助力 Vue3 開發:打造絲滑的懸浮按鈕(Floating Action Button)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

【前端場景題】如何應對頁面請求接口的大規模并發問題

如何應對頁面請求接口的大規模并發問題&#xff0c;尤其是前端方面的解決方案&#xff0c;并且需要給出詳細的代碼解釋。首先&#xff0c;我需要仔細閱讀我搜索到的資料&#xff0c;找出相關的信息&#xff0c;然后綜合這些信息來形成答案。 首先看&#xff0c;它提到前端優化策…

360個人版和企業版的區別

功能方面 管理能力 個人版&#xff1a;主要用于單臺設備的安全防護&#xff0c;只能在單獨的電腦上進行安裝使用&#xff0c;無集中管理和監控其他設備的功能。企業版&#xff1a;可批量管理大量電腦&#xff0c;如公司的十臺、百臺甚至千臺電腦。管理員能通過管理控制臺對所有…

蘋果與小米破冰合作:iPhone 16e全面支持Find My網絡,跨生態互通實現技術性突破

2025年2月28日&#xff0c;蘋果公司正式宣布其中國區特供機型iPhone 16e全面接入Find My網絡升級版&#xff0c;并與小米旗艦機型15 Ultra實現跨平臺互聯互通。 核心功能升級 1. Find My網絡能力擴展 iPhone 16e搭載的Find My 3.0網絡支持亞米級定位&#xff08;誤差<1米…

Spring MVC 程序開發(1)

目錄 1、什么是 SpringMVC2、返回數據2.1、返回 JSON 對象2.2、請求轉發2.3、請求重定向2.4、自定義返回的內容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分別是什么&#xff1f;有什么關系&#xff1f; Servlet 是 java 官方定義的 web 開發的標準規范&#xff1b;Tomcat 是…

一鍵安裝Mysql部署腳本之Linux在線安裝Mysql,腳本化自動化執行服務器部署(附執行腳本下載)

相關鏈接 一鍵安裝Redis部署腳本之Linux在線安裝Redis一鍵安裝Mysql部署腳本之Linux在線安裝Mysql一鍵安裝JAVA部署腳本之Linux在線安裝JDK一鍵安裝Nginx部署腳本之Linux在線安裝NginxNavicat最新版(17)詳細安裝教程Xshell客戶端免費版無需注冊XFtp客戶端免費版無需注冊 前言…

1.2.2 使用Maven方式構建Spring Boot項目

本次實戰通過Maven方式構建了一個Spring Boot項目&#xff0c;實現了簡單的Web應用。首先&#xff0c;創建了Maven項目并設置好項目名稱、位置、構建系統和JDK等。接著&#xff0c;添加了Spring Boot的父項目依賴和web、thymeleaf起步依賴。然后&#xff0c;創建了項目啟動類He…

【愚公系列】《Python網絡爬蟲從入門到精通》037-文件的存取

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

C++:vector的push_back時間復雜度分析

引導示例 #include <iostream> #include <vector>int main() {std::vector<int> v;std::cout << v.capacity() << " ";int last 0;for (int i 1; i < 10; i) {v.push_back(1);std::cout << v.capacity() << " …

LeetCode 202. 快樂數 java題解

https://leetcode.cn/problems/happy-number/description/ 哈希表 class Solution {public boolean isHappy(int n) {if(n1) return true;HashSet<Integer> setnew HashSet<>();while(n!1&&!(set.contains(n))){//沒找到結果&#xff1b;沒有重復出現過se…

11.24 SpringMVC(1)@RequestMapping、@RestController、@RequestParam

一.RequestMapping("/user")//HTTP 請求方法既支持get也支持post&#xff0c;可表示為類路徑與方法路徑 二.RequestMapping(value "/m7", method {RequestMethod.POST, RequestMethod.GET}) value這個參數指定了請求的 URL 路徑。method 參數指定了允許…

解決npm run dev報錯

解決&#xff1a;Node.js 版本更新后與 OpenSSL 不兼容導致的npm報錯“Error: error:0308010C:digital envelope routines::unsupported” 方法一&#xff1a;更改系統環境變量方法二&#xff1a;更改項目環境變量方法三&#xff1a;更換 Node.js 版本方法四&#xff1a;升級依…