前端之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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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-…