前端之vue3創建基本工程,基本登錄、注冊等功能的完整過程

此文也是為了做一個基本學習用的vue3創建項目的過程,包含基本的登錄頁面、登出頁面、基本的router跳轉、axios調用、登錄驗證等內容。與項目:
https://gitee.com/rainpet/java-web-demo/tree/master/spring-security01
可以配套使用。
如下為主要過程。

1、node.js下載地址:
https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/
下載一個LTS版本的 v20和v22都是
https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/v20.19.2/
https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/v22.15.1/
這里下載v20的。
2、解壓到路徑,我這里用的是:
D:\wamp\node-v20
設置系統path變量
設置好后,可以通過
node --version
來查看版本是否生效。
3、全局安裝基本的包:工程工具(vite)、包管理工具(yarn、cnpm)
npm install -g yarn
npm install -g cnpm
npm install -g vite
4、項目創建,咱們的目標是要創建一個spa(single page application)程序,這也是vue的主流應用方式。
切換到工程目錄:
d:
cd D:\java\workspace>
創建工程命令
npm create vite@latest
輸入工程名稱:vuedemo01
選擇框架:Vue
選擇類型:JavaScript
完成創建。
5、安裝vscode,安裝相應的擴展:
Vue - Official
6、進入到vscode,打開終端,使用cmd模式。
安裝本項目的依賴
yarn add axios
yarn add element-plus
yarn add vue-router
yarn add @element-plus/icons-vue
yarn add vite-plugin-vue-devtools
7、打開項目,修改vie.config.js文件,增加后臺api的代理設置,確認有如下的server的相關內容。

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'export default defineConfig({plugins: [vue(),vueDevTools(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))},},server: {port: 8080,proxy: {'/api': {target: 'http://localhost:8086',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, ''),//去掉原始api的前綴},},},
})

8、src下,創建目錄:router,目錄中增加文件:index.js

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'home',//component: Home,component: () => import('../views/HomeView.vue'),}],
})
export default router

9、修改入口的js文件,src/main.js,將組建加入到Vue的上下文:
由:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'createApp(App).mount('#app')

改為:

import { createApp } from 'vue'
//import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'const app = createApp(App)//app.use(createPinia())
app.use(router)
app.use(ElementPlus)
app.mount('#app')

10、創建組件-Header.vue:

<template><el-header class="header"><div class="logo"><h2>Vue Demo</h2></div><div class="header-right"><el-dropdown><span class="el-dropdown-link">Admin<el-icon class="el-icon--right"><arrow-down /></el-icon></span><template #dropdown><el-dropdown-menu><el-dropdown-item @click="handleCommand('info')">關于</el-dropdown-item><el-dropdown-item @click="handleCommand('logout')">退出登錄</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div></el-header>
</template><script setup>
import { ArrowDown } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'const router = useRouter()const handleCommand = (command) => {switch (command) {case 'info':router.push('/about')breakcase 'logout':// 這里可以添加退出登錄的邏輯console.log('退出登錄')router.push('/logout')break}
}
</script><style scoped>
.header {background-color: #409EFF;color: white;display: flex;align-items: center;justify-content: space-between;padding: 0 20px;
}.logo h2 {margin: 0;
}.header-right {display: flex;align-items: center;
}.el-dropdown-link {color: white;cursor: pointer;display: flex;align-items: center;
}
</style> 

11、組件 Footer.vue

<template><el-footer class="footer"><p>? 2024 Vue Demo. All rights reserved.</p></el-footer>
</template><script setup>
</script><style scoped>
.footer {background-color: #f5f7fa;color: #606266;text-align: center;padding: 20px 0;border-top: 1px solid #e4e7ed;
}.footer p {margin: 0;
}
</style> 

12、組件:SideMenu.vue

<template><el-menuclass="side-menu el-menu-vertical":default-active="activeIndex":collapse="isCollapse"router><el-menu-item index="/"><el-icon><HomeFilled /></el-icon><template #title>首頁</template></el-menu-item><el-sub-menu index="/about"><template #title><el-icon><Document /></el-icon><span>功能</span></template><el-menu-item index="/order/list">訂單</el-menu-item></el-sub-menu></el-menu>
</template><script setup>
import { ref } from 'vue'
import { HomeFilled, Document, Setting, InfoFilled } from '@element-plus/icons-vue'const activeIndex = ref('/')
const isCollapse = ref(false)
</script><style scoped>
.side-menu {height: 100%;border-right: none;
}.el-menu-vertical:not(.el-menu--collapse) {width: 200px;
}
</style> 

13、IndexView.vue

<template><div class="dashboard-container"><el-row :gutter="20"><el-col :span="6"><el-card shadow="hover"><template #header><div class="card-header"><span>訪問量</span></div></template><div class="card-content"><h2>1,234</h2></div></el-card></el-col><el-col :span="6"><el-card shadow="hover"><template #header><div class="card-header"><span>用戶數</span></div></template><div class="card-content"><h2>567</h2></div></el-card></el-col><el-col :span="6"><el-card shadow="hover"><template #header><div class="card-header"><span>訂單數</span></div></template><div class="card-content"><h2>890</h2></div></el-card></el-col><el-col :span="6"><el-card shadow="hover"><template #header><div class="card-header"><span>收入</span></div></template><div class="card-content"><h2>¥12,345</h2></div></el-card></el-col></el-row></div></template><script setup></script><style scoped>.dashboard-container {padding: 20px;}.card-header {display: flex;justify-content: space-between;align-items: center;}.card-content {text-align: center;}.card-content h2 {margin: 10px 0;color: #409EFF;}</style>

14、HomeView.vue

<template><el-container class="layout-container"><Header /><el-container class="main-container"><el-aside width="200px" class="aside"><SideMenu /></el-aside><el-container class="content-container"><el-main><router-view><IndexView /></router-view></el-main><Footer /></el-container></el-container></el-container>
</template><script setup>
import Header from '@/components/Header.vue'
import Footer from '@/components/Footer.vue'
import SideMenu from '@/components/SideMenu.vue'
import IndexView from '@/views/IndexView.vue'
</script><style scoped>
.layout-container {height: 100vh;display: flex;flex-direction: column;
}.main-container {flex: 1;
}.aside {background-color: #fff;border-right: 1px solid #e6e6e6;
}.content-container {flex: 1;display: flex;flex-direction: column;
}.el-main {flex: 1;background-color: #f5f7fa;padding: 20px;
}
</style> 

15、AboutView.vue

<template><el-container class="layout-container"><Header /><el-container class="main-container"><el-aside width="200px" class="aside"><SideMenu /></el-aside><el-container class="content-container"><el-main><router-view><div class="about-content"><el-descriptions :column="1" border><el-descriptions-item label="系統名稱">Vue Demo System</el-descriptions-item><el-descriptions-item label="版本">1.0.0</el-descriptions-item><el-descriptions-item label="技術棧">Vue 3 + Element Plus + Vue Router</el-descriptions-item><el-descriptions-item label="開發團隊">Demo Team</el-descriptions-item></el-descriptions></div></router-view></el-main><Footer /></el-container></el-container></el-container></template><script setup>
import Header from '@/components/Header.vue'
import Footer from '@/components/Footer.vue'
import SideMenu from '@/components/SideMenu.vue'</script><style scoped>
.about-container {padding: 20px;
}.about-card {max-width: 800px;margin: 0 auto;
}.card-header {display: flex;justify-content: space-between;align-items: center;
}.card-header h2 {margin: 0;color: #409EFF;
}.about-content {margin-top: 20px;
}
.layout-container {height: 100vh;display: flex;flex-direction: column;
}.main-container {flex: 1;
}.aside {background-color: #fff;border-right: 1px solid #e6e6e6;
}.content-container {flex: 1;display: flex;flex-direction: column;
}.el-main {flex: 1;background-color: #f5f7fa;padding: 20px;
}
</style> 

16、App.vue 最終修改為:

<script setup></script><template><router-view></router-view>
</template><style>
html, body {margin: 0;padding: 0;height: 100%;width: 100%;
}#app {height: 100%;width: 100%;
}
</style>

17、登錄LoginView.vue

<template><div class="login-container"><div class="login-box"><h1>登錄</h1><el-form @submit.prevent="handleLogin" label-position="top" class="login-form"><el-form-item label="用戶名"><el-input v-model="username" required @keyup.enter="handleLogin"></el-input></el-form-item><el-form-item label="密碼"><el-input type="password" v-model="password" required @keyup.enter="handleLogin"></el-input></el-form-item><el-form-item><el-button type="primary" @click="handleLogin" class="login-button">登錄</el-button></el-form-item></el-form><p v-if="errorMessage" class="error">{{ errorMessage }}</p><p class="register-link">還沒有賬號?<a href="/register">注冊</a></p></div></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';
import { useRouter } from 'vue-router';
import { ElForm, ElFormItem, ElInput, ElButton, ElMessage } from 'element-plus';const username = ref('');
const password = ref('');
const errorMessage = ref('');const router = useRouter();const handleLogin = async () => {try {const response = await axios.post('/api/user/login', {userName: username.value,password: password.value});if (response.data.code === 200) {errorMessage.value = '';localStorage.setItem('token', response.data.data.token);localStorage.setItem('userId', response.data.data.userId);localStorage.setItem('userName', response.data.data.userName);router.push('/');} else {errorMessage.value = response.data.msg;}} catch (error) {errorMessage.value = '登錄失敗,請檢查用戶名和密碼';}
};
</script><style scoped>
.login-container {display: flex;justify-content: center;align-items: center;height: 100vh;/* background: linear-gradient(135deg, #6e8efb, #a777e3); */
}.login-box {width: 400px;padding: 40px;background-color: #fff;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);text-align: center;
}.login-box h1 {margin-bottom: 30px;font-size: 24px;color: #333;
}.login-form {display: flex;flex-direction: column;
}.login-form .el-form-item {margin-bottom: 20px;
}.login-button {width: 100%;background-color: #6e8efb;border-color: #6e8efb;
}.login-button:hover {background-color: #5a7de1;border-color: #5a7de1;
}.error {color: red;margin-top: 10px;
}.register-link {margin-top: 20px;color: #333;
}.register-link a {color: #6e8efb;text-decoration: none;
}.register-link a:hover {text-decoration: underline;
}
</style>

18、登出頁面 LogoutView.vue

<template><div class="logout-container"><Header /><el-container class="content"><el-main><h1>您已退出登錄!</h1><el-button type="primary" @click="goHome">返回首頁</el-button></el-main></el-container></div>
</template><script setup>
import { onMounted } from 'vue';
import { useRouter } from 'vue-router';
import Header from '@/components/Header.vue';const router = useRouter();const goHome = () => {router.push('/');
};onMounted(() => {// 退出登錄邏輯,刪除存儲的 tokenlocalStorage.removeItem('token');
});
</script><style scoped>
.logout-container {text-align: center;padding: 2rem;
}.content {display: flex;flex-direction: column;align-items: center;justify-content: center;height: calc(100vh - 200px); /* Adjust height based on header */
}h1 {margin-bottom: 1rem;
}.el-button {margin-top: 2rem;
}
</style>

19、注冊頁面 RegisterView.vue

<template><div class="register-container"><h1>注冊</h1><el-form :model="form" @submit.prevent="submitForm" ref="registerForm" label-position="top" class="register-form"><el-form-item label="用戶名" :label-width="formLabelWidth"><el-input v-model="form.userName" required></el-input></el-form-item><el-form-item label="密碼" :label-width="formLabelWidth"><el-input type="password" v-model="form.password" required></el-input></el-form-item><el-form-item label="確認密碼" :label-width="formLabelWidth"><el-input type="password" v-model="confirmPassword" @input="checkPasswordMatch" required></el-input><span v-if="passwordMismatch" class="error">密碼不一致</span></el-form-item><el-form-item label="郵箱" :label-width="formLabelWidth"><el-input type="email" v-model="form.email" required></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm" class="register-button">注冊</el-button></el-form-item></el-form></div></template><script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { ElForm, ElFormItem, ElInput, ElButton, ElMessage } from 'element-plus';
import axios from 'axios';const form = ref({userName: '',password: '',email: ''
});
const confirmPassword = ref('');
const passwordMismatch = ref(false);
const formLabelWidth = '100px';
const router = useRouter();const checkPasswordMatch = () => {passwordMismatch.value = form.value.password !== confirmPassword.value;
};const submitForm = async () => {checkPasswordMatch();if (!passwordMismatch.value) {try {const response = await axios.post('/api/user/register', form.value);if (response.data.code === 200) {ElMessage.success('注冊成功');router.push('/login');} else {ElMessage.error('注冊失敗,請重試,' + response.data.msg);}} catch (error) {ElMessage.error('注冊失敗,請重試');}}
};
</script><style scoped>.register-container {max-width: 500px;margin: 0 auto;padding: 20px;background-color: #f9f9f9;border-radius: 8px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}.register-container h1 {text-align: center;margin-bottom: 20px;}.register-form {display: flex;flex-direction: column;}.register-button {width: 100%;}.error {color: red;font-size: 12px;margin-top: 5px;}</style>

20、修改src/router/index.js,增加如下內容,以實現登錄驗證:

router.beforeEach((to, from, next) => {if (to.name !== 'login' && to.name !== 'logout' && to.name !=='register' && !localStorage.getItem('token')) {next({ name: 'login' })} else {next()}
})

21、增加最終的登錄后測試頁面 OrderView.vue:

<template><div><Header /><div class="layout"><Sidebar /><div class="content"><section class="order"><h4>訂單列表</h4><div v-if="orders.length > 0"><el-table :data="orders" style="width: 100%"><el-table-column prop="fdate" label="訂單日期" /><el-table-column prop="orderAmount" label="訂單金額" /><el-table-column prop="status" label="訂單狀態" /><el-table-column prop="address" label="收貨地址" /><el-table-column label="操作"><template #default="scope"><el-button type="primary" @click="placeOrder(scope.row)">支付</el-button><el-button type="info" @click="showDetails(scope.row)">詳情</el-button></template></el-table-column></el-table><div class="order-total"><h3>總計: {{ formatCurrency(orderAmounts) }}</h3></div></div><div v-else><p>訂單是空的。</p></div></section></div></div><Footer /><el-dialogv-model="dialogVisible"title="Tips"width="800":before-close="handleClose"><template #title><span>訂單詳情</span></template><el-table :data="selectedOrder.entries" style="width: 100%"><el-table-column prop="goodsName" label="商品ID" /><el-table-column prop="qty" label="數量" /><el-table-column prop="price" label="價格"><template #default="entryScope"><span>{{ entryScope.row.price }}</span></template></el-table-column><el-table-column prop="orderAmount" label="金額"><template #default="entryScope"><span>{{ entryScope.row.amount }}</span></template></el-table-column></el-table><div class="order-total"><h3>訂單小計: {{ formatCurrency(detailAmount) }}</h3></div><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">關閉</el-button></span></el-dialog></div>
</template><script setup>
import { ref, computed, onMounted } from 'vue';
import Header from '@/components/Header.vue';
import Sidebar from '@/components/Sidemenu.vue';
import Footer from '@/components/Footer.vue';
import axios from 'axios';
import { useRouter } from 'vue-router';const router = useRouter();
const orders = ref([]);
const dialogVisible = ref(false);
const selectedOrder = ref({ entries: [] });const getOrdersList = async () => {try {const token = localStorage.getItem('token');const userId = localStorage.getItem('userId');const headers = {'token': `${token}`};const response = await axios.get('/api/orders/listByOwner/' + userId, { headers: headers });//console.log(response.data);console.log(response.data.data);// 檢查響應數據格式if (Array.isArray(response.data.data)) {orders.value = response.data.data;} else if (response.data.code === 401) {router.push('/login');} else {console.error('服務器返回的數據格式不正確:', response.data);}} catch (error) {console.error('獲取訂單列表失敗:', error);}
};const formatCurrency = (amount) => {return amount.toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' }).replace('CNY', '');
};const detailAmount = computed(() => {return Math.round(selectedOrder.value.entries.reduce((total, entry) => total + entry.amount, 0),2);
});const orderAmounts = computed(() => {return orders.value.reduce((total, order) => {return Math.round(total + order.entries.reduce((orderTotal, entry) => orderTotal + entry.amount, 0),2);}, 0);
});const placeOrder = (order) => {// 支付邏輯alert(`訂單 ${order.id} 已支付`);
};const showDetails = (order) => {console.log(`查看訂單詳情: ${order.id}`);selectedOrder.value = order;console.log(selectedOrder.value);dialogVisible.value = true;console.log(dialogVisible.value);
};const handleClose = (done) => {dialogVisible.value = false;
};onMounted(() => {getOrdersList();
});
</script><style scoped>
.layout {display: flex;
}
.el-dialog {display: block !important;
}
.content {flex: 1;display: flex;justify-content: center;align-items: flex-start;padding: 20px;background-color: #fff;overflow-y: auto;
}.order {max-width: 1200px;width: 100%;margin: 0 auto;padding: 2rem;
}.order-total {text-align: right;margin-top: 2rem;
}.order-total h3 {font-size: 1.5rem;color: #333;
}.el-button {margin-top: 1rem;
}
</style>

22、增加相應的router的內容

{path: '/logout',name: 'logout',component: () => import('../views/LogoutView.vue')},{path:'/login',name: 'login',component: () => import('../views/LoginView.vue')},{path: '/register',name: 'register',component: () => import('../views/RegisterView.vue')},{path: '/order/list',name: 'orderList',component: () => import('../views/OrderView.vue')}

23、最終的項目結構:
在這里插入圖片描述

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

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

相關文章

如果有三個服務實例部署在三臺不同的服務器上,這三個服務實例的本地緩存,是存儲一模一樣的數據?還是各自只存一部分?

? 答案是&#xff1a;通常每個服務實例都會獨立地緩存它自己訪問過的數據&#xff0c;這些數據可能是相同的&#xff0c;也可能是不同的&#xff0c;取決于請求的內容。 &#x1f4cc; 舉個例子說明 假設你有一個商品詳情頁的服務&#xff0c;部署了 3 個服務實例&#xff08…

九州未來十三載:開源賦能 智啟未來

2012年&#xff0c;九州未來以“開源賦能云邊變革”為使命&#xff0c;開啟中國開放云邊基礎架構服務的探索之路。十三載堅守深耕&#xff0c;我們始終以開源為翼&#xff0c;以算力為基&#xff0c;在科技浪潮中砥礪前行&#xff0c;見證并推動著AI時代的算力變革。 堅守初心丨…

Axure項目實戰:智慧運輸平臺后臺管理端-訂單管理1(多級交互)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:訂單管理 主要內容:條件組合、中繼器篩選、表單跟隨菜單拖動、審批數據互通等 應用場景…

WebAssembly:開啟跨平臺高性能編程的新時代

在當今的互聯網時代&#xff0c;Web 應用的復雜性和性能要求越來越高。從簡單的網頁瀏覽到復雜的在線游戲、實時數據處理和圖形渲染&#xff0c;開發者需要一種能夠兼顧性能和兼容性的技術。WebAssembly&#xff08;簡稱 Wasm&#xff09;應運而生&#xff0c;它作為一種新興的…

大數據治理:理論、實踐與未來展望(二)

書接上文 文章目錄 七、大數據治理的未來發展趨勢&#xff08;一&#xff09;智能化與自動化&#xff08;二&#xff09;數據隱私與安全的強化&#xff08;三&#xff09;數據治理的云化&#xff08;四&#xff09;數據治理的跨行業合作&#xff08;五&#xff09;數據治理的生…

計算機視覺與深度學習 | Matlab實現EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR時間序列預測(完整源碼和數據)

以下是一個完整的Matlab時間序列預測實現方案,包含EMD-GWO-SVR、EMD-SVR、GWO-SVR和SVR四種方法的對比。代碼包含數據生成、信號分解、優化算法和預測模型實現。 %% 主程序:時間序列預測對比實驗 clc; clear; clearvars; close all;% 生成模擬時間序列數據 rng(1); % 固定隨…

RabbitMQ核心特性——重試、TTL、死信隊列

一、重試機制 在消息傳輸過程中&#xff0c;可能遇到各種問題&#xff0c;如網絡故障&#xff0c;服務器不可用等&#xff0c;這些問題可能導致消息處理失敗&#xff0c;因此RabbitMQ提供了重試機制&#xff0c;允許消息處理失敗后重新發送&#xff0c;但是&#xff0c;如果是因…

MVCC實現原理

MVCC的基本概念 MVCC&#xff0c;一個數據的多個版本&#xff0c;使得讀寫操作沒有沖突。 在多個事務并發的情況下&#xff0c;確定到底要訪問哪個版本。 MVCC實現原理 MVCC實現依賴于隱式字段&#xff0c;undo log日志&#xff0c;readView 隱式字段 在mysql用戶自定義的…

湖北理元理律師事務所債務優化方案解析:如何科學規劃還款保障生活質量

在當前經濟環境下&#xff0c;債務問題已成為困擾許多家庭的重要難題。據相關統計數據顯示&#xff0c;我國個人負債率呈現逐年上升趨勢&#xff0c;如何合理規劃還款、保障基本生活質量成為亟待解決的社會問題。湖北理元理律師事務所基于多年實務經驗&#xff0c;研發出一套科…

ffmpeg 轉換視頻格式

使用FFmpeg將視頻轉換為MP4格式的常用命令&#xff1a; ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi&#xff1a;指定輸入文件 -c:v libx264&#xff1a;使用H.264視頻編碼器 -crf 23&#xff1a;控制視頻質量&#xff08;范圍18-28&#…

LLM Tuning

Lora-Tuning 什么是Lora微調&#xff1f; LoRA&#xff08;Low-Rank Adaptation&#xff09; 是一種參數高效微調方法&#xff08;PEFT, Parameter-Efficient Fine-Tuning&#xff09;&#xff0c;它通過引入低秩矩陣到預訓練模型的權重變換中&#xff0c;實現無需大規模修改…

實現tdx-hs300-mcp

文章目錄 項目簡介功能說明使用方法配置說明項目簡介 tdx-hs300-mcp是一個Model Context Protocol (MCP)的服務 功能說明 下載數據自動保存為CSV格式文件使用方法 確保已安裝Python 3.7+和依賴庫: pip install pytdx fastapi uvicorn啟動MCP服務: mcp run MCP.py使用MCP工具…

《100天精通Python——基礎篇 2025 第20天:Thread類與線程同步機制詳解》

目錄 一、概念簡單回顧二、Python的線程開發2.1 Thread類2.1.1 線程啟動2.1.2 線程退出2.1.3 線程的傳參2.1.4 threading的屬性和方法2.1.5 Thread實例的屬性和方法2.1.6 start和run方法 2.2 多線程2.3 線程安全2.4 daemon線程2.5 threading.local類2.6 __slots__拓展 三、線程…

【web應用】前后端分離開源項目聯調運行的過程步驟ruoyi

文章目錄 ?前言?一、項目運行環境準備?二、數據庫創建&#x1f31f;1、新建數據庫&#x1f31f;2、導入數據腳本 ?三、運行后端項目&#x1f31f;1、打開后端項目&#x1f31f;2、后端項目配置項修改 ?四、運行前端項目VUE3&#x1f31f;1、在IDEA另一個窗口中打開前端項目…

【深度剖析】三一重工的數字化轉型(下篇1)

在數字經濟持續發展的背景下,企業數字化轉型方案成為實現轉型的關鍵。不同行業內的企業因轉型動機和路徑的差異,其轉型成效也各異。三一重工作為機械制造行業的領軍企業,較早地實施了數字化轉型,并積累了豐富的經驗。本研究選取三一重工作為案例,通過梳理相關文獻,對其數…

Nacos適配GaussDB超詳細部署流程

1部署openGauss 官方文檔下載 https://support.huaweicloud.com/download_gaussdb/index.html 社區地址 安裝包下載 本文主要是以部署輕量級為主要教程 1.1系統環境準備 操作系統選擇 系統AARCH64X86-64openEuler√√CentOS7√Docker√√1.2軟硬件安裝環境 版本輕量版(單…

國際前沿知識系列五:時間序列建模方法在頭部撞擊運動學測量數據降噪中的應用

目錄 國際前沿知識系列五&#xff1a;時間序列建模方法在頭部撞擊運動學測量數據降噪中的應用 一、引言 二、時間序列建模方法 &#xff08;一&#xff09;ARIMA 模型 &#xff08;二&#xff09;指數平滑法 &#xff08;三&#xff09;小波變換 三、實際案例分析 &…

線性代數中的向量與矩陣:AI大模型的數學基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

第十七次CCF-CSP算法(含C++源碼)

第十七次CCF-CSP認證 小明種蘋果AC代碼 小明種蘋果&#xff08;續&#xff09;AC代碼 后面好難哈哈 小手冰涼 小明種蘋果 輸入輸出&#xff1a; 題目鏈接 AC代碼 #include<iostream> using namespace std; int n,m; int res,res3; int sum; int res21; int main(){cin …

curl常用指令

curl使用記錄 curl常用指令安裝請求get請求post請求錯誤排查 curl常用指令 安裝 sudo apt update sudo apt install curl -y請求 get請求 curl [URL]如果能正常請求&#xff0c;則會返回正常的頁面信息 post請求 發送 JSON 數據? curl -X POST [URL] -H "Content-…