立即升级你的前端技能!跟随这份Vue3项目搭建教程,从零基础到专业,一步步掌握最新Web开发技术,打造响应快速、界面优雅的现代网站。

      全能开发套餐,轻松打造现代网站!Vue3携手Vite带来开发新体验,结合Axios、Pinia、Element Plus实现功能与美观并重,TailwindCSS与DaisyUI提供设计灵活性,Router 4处理页面导航。从前端到后端,一站式解决!

一.创建项目(vue + js)

pnpm create vite  

二.安装Axios 和 cookie 

pnpm install axios
pnpm install js-cookie

1. 在根目录下创建.env.development 和 .env.production 文件

ENV = 'development'VITE_BASE_URL='/api'
ENV = 'production'VITE_BASE_URL = 'http://xxxxxx/api/'

 2.修改packge.josn

  "scripts": {"dev": "vite --mode development","build": "vite build --mode production","preview": "vite preview"},

2.在 src 文件下创建一个 config 文件夹,并添加 Api.js 文件(封装请求体)

import axios from 'axios'
import Cookies from "js-cookie";
let BASE_URL = import.meta.env.VITE_BASE_URL;/*** 参数转换* @param result* @returns {string}*/const queryParam =result=> {let queryString = Object.keys(result).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(result[key])}`).join('&');if (queryString.length >= 2) {return '?' + queryString;} else {return '';}}/*** 构建请求体* @param url* @param method* @param param* @param query*/
export const Ask =(url, method = 'GET', param = {}, query = {})=> {return new Promise((resolve, reject) => {try {const config = {url: BASE_URL + url + queryParam(query),method,data: param,headers: {'content-type': 'application/json','Authorization': "Bearer " + Cookies.get('token') || '',}};axios(config).then(response => {if (response.status === 200 || response.status === '200') {resolve(response.data)}else {reject(response)}}).catch(error => reject(error));} catch (err) {reject(err);}});
}

 3.在 src 文件下创建一个 Interface文件夹(封装的接口文件夹)

  例如:创建一个userApi.js 文件

import {Ask} from "../config/Api.js";/*** 登陆接口*/
export function loginApi(param,query){return Ask('/login','POST',param,query);
}

三. 安装状态管理器和数据持久化

pnpm install pinia
pnpm i pinia-plugin-persist

1.安装完 Pinia 包之后,需要在 main.js 文件中导入 createPinia 函数并将 Pinia 插件与 Vue 应用程序绑定

//main.jsimport { createPinia } from 'pinia';
import piniaPersist from 'pinia-plugin-persist'const app = createApp(App)const pinia = createPinia()
pinia.use(piniaPersist)

2.在 src 文件下创建一个 store 文件夹,并添加 store.js 文件

import { defineStore } from 'pinia';
import axios from 'axios';export const storeMange = defineStore('store',{state: () => {return{menuList:[]}},getters:{getMenuList(){return this.menuList;}},actions:{setMenuList() {this.menuList=[2342]}},persist: {enabled:true,strategies: [{storage: localStorage,paths: ['menuList']},]},
})

四.安装路由(通过接口设置动态路由),若您不需要,只需要index.js,删除addRouter()方法

pnpm add vue-router@4

1.在 src 文件下创建一个 router 文件夹,并添加 index.js 文件和routerTool.js文件

//router.js
import { createRouter, createWebHashHistory } from 'vue-router'
import {addRouter} from "./RouterTool.js";const router = createRouter({history: createWebHashHistory(),routes: addRouter()
})
export default router
//routerTool.js
import {queryMenuApi} from "../Interface/system/menuApi.js";
import Cookies from "js-cookie";
let routers=[{name: 'index',path: '/',meta:{name: '首页',},component:()=>import('../pages/frontWeb/index.vue'),children:[]}, {name: 'admin',path: '/admin',component:()=>import('../pages/afterAdmin/index.vue'),meta:{name: '工作台',},children:[]}
];/*** 菜单子集整合*/
function childrenList(item,list){let result =[];list.map(item2=>{if (item.id===item2.parentId){item.children=childrenList(item2,list)result.push(item2);}})return result;
}/*** 菜单 整合*/
export function routerMap(list){let frontWebList = [];let afterAdminList =[];list.frontWeb.map((item)=>{item.children=[];if (item.parentId===0){item.children=childrenList(item,list.frontWeb);frontWebList.push(item);}});list.afterAdmin.map((item)=>{item.children=[];if (item.parentId===0){item.children=childrenList(item,list.afterAdmin);afterAdminList.push(item);}});return [frontWebList, afterAdminList];
}/***router 整合*/
function setRouter(lists=[]){let routerList=[];lists.map(item=>{if (!item.isOutsidePath){let routerObj ={name: item.name,path: item.path,///* @vite-ignore */ 是消除警告component: () => import(/* @vite-ignore */ "../pages/"+item.pagePath+".vue"),meta:item.meta,children:setRouter(item.children || [])}routerList.push(routerObj);}})return routerList;
}/*** 添加router*/
export function addRouter(){queryMenuApi()let routerList =routers;let cookies = Cookies.get("menuList");let cookList = cookies? JSON.parse(cookies) : [];cookList.map((item,index)=>{routerList[index].children=setRouter(cookList[index])});return routerList;
}

 接口方法:(参考)

/*** 获取菜单*/
export function queryMenuApi(query){Ask('/menu/query','GET',{},query).then(res=>{if (res.code===200){let list = routerMap(res.data) || [];Cookies.set("menuList",JSON.stringify(list));}});
}//返回字段解读
{"id": 1,"menuName": "菜单的名称","name": "router 的name","path": "router 的path","pagePath": "router 的component拼接路径","meta": {}, //meta 头"isIcon": "",//选中图标地址 //(可选)"noIcon": "",//未选中图标地址 //(可选)"sort": 1,//菜单排序 //(可选)"type": "",//菜单类型 "parentId": 0,//父级id(上一级的id,关联到router 的children[]) 默认是0 "createTime": "2024-08-07 14:51:56",//(可选)"updateTime": "2024-08-07 14:51:56",//(可选)"createUserName": "",//(可选)"updateUserName": "",//(可选)"purview": "",//菜单权限(可选)"pageType": "" // 菜单分类 我分为前台router 和后台router () //"afterAdmin" 和"frontWeb"
}接口返回数据例子{"code": 200,"msg": "成功!","data": {"afterAdmin": [],"frontWeb": [{"id": 1,"menuName": "测试数据","name": "test","path": "/","pagePath": "frontWeb/test","meta": {"title": "测试页面"},"isIcon": "","noIcon": "","sort": 1,"type": "page","parentId": 0,"createTime": "2024-08-06 16:54:35","updateTime": "2024-08-06 16:54:35","createUserName": "小苏呀","updateUserName": "小苏呀","purview": "administrator","pageType": "frontWeb"}]}
}

2.在main.js中引入

import router from './router/index.js'
app.use(router);

 3.页面测试

App.vue

<style>
html,body{height: 100%;width: 100%;
}
</style>
<template><div><router-view/></div>
</template>

frontWeb/index.vue

<style scoped></style><template>
<div><div>111</div><router-view />
</div>
</template><script setup>
</script>

 运行项目示例

五.安装 element-plus 

pnpm install element-plus
pnpm install -D unplugin-vue-components unplugin-auto-import

 1.vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({plugins: [vue(),AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],server: {open:true,host: '0.0.0.0',port: 3001,}
})

2.安装图标

pnpm install @element-plus/icons-vue
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import { createPinia } from 'pinia';
import piniaPersist from 'pinia-plugin-persist'
import router from './router/index.js'import * as ElementPlusIconsVue from '@element-plus/icons-vue'const app = createApp(App)for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}const pinia = createPinia()
pinia.use(piniaPersist)
app.use(pinia);
app.use(router);
app.mount('#app');

测试:

    <div><el-button type="primary" :icon="Edit" /><el-button type="primary" :icon="Share" /><el-button type="primary" :icon="Delete" /><el-button type="primary" :icon="Search">Search</el-button><el-button type="primary">Upload<el-icon class="el-icon--right"><Upload /></el-icon></el-button></div>

 六.安装Tailwind CSS 和 daisyUI

pnpm add -D daisyui@latest
pnpm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

1.修改一下tailwind.config配置文件,修改成下面这样的

/** @type {import('tailwindcss').Config} */
import daisyui from "daisyui";
module.exports = {content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],theme: {extend: {},},plugins: [daisyui],
}

3.在style.css 文件添加样式

//全部替换或者添加
@tailwind base;
@tailwind components;
@tailwind utilities;

4.测试

    <div class="button-container flex justify-center my-10"><button class="btn">Button</button><button class="btn btn-primary">Button</button><button class="btn btn-secondary">Button</button><button class="btn btn-accent">Button</button><button class="btn btn-ghost">Button</button><button class="btn btn-link">Button</button></div>

运行后效果

所有安装教程就到这了,有更好就方式,私信小编!!!!

需要前端+后端配套源码私信小编,附带测试数据库

推荐程序网站:

天梦星服务平台 (tmxkj.top)icon-default.png?t=N7T8https://tmxkj.top/#/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、Matlab基础

文章目录 一、Matlab界面二、Matlab窗口常用命令三、Matlab的数据类型3.1 数值类型3.2 字符和字符串3.3 逻辑类型3.4 函数句柄3.5 结构类型3.6 细胞数组 四、Matlab的运算符4.1 算术运算符4.2 关系运算符4.3 逻辑运算4.4 运算符优先级 五、Matlab的矩阵5.1 矩阵的建立5.2 矩阵的…

【Linux】输入输出重定向

目录 一、概念 二、重定向的本质 三、系统调用接口dup和dup2 3.1 dup 3.2 dup2 一、概念 在之前对Linux的学习中&#xff0c;我们有接触过一系列的重定向命令&#xff0c;例如 >、>>等 它们可以将一个命令的输出或输入重定向到其他地方&#xff0c;如echo命令…

开源应用:AI监测如何成为社会安全的智能盾牌

社会背景 随着社会的快速发展&#xff0c;社会安全管理正站在一个新时代的门槛上。社会对安全管理的需求不断增长&#xff0c;传统的安全措施已难以满足现代社会的需求。AI技术以其独特的数据处理和模式识别能力&#xff0c;正在成为我们社会安全的智能盾牌。 AI大模型识别功能…

3.js - 物理引擎终极

import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import gsap from gsap // 导入动画库 import * as dat from dat.gui // 导入dat.gui// 导入 cannon-es 引擎 import * as CANNON from cannon-es// -----------------…

探索GPT-4o mini:开启AI驱动的开发新时代

文章目录 GPT-4o mini&#xff1a;小身材&#xff0c;大能量成本与效能的完美平衡 AI辅助开发&#xff1a;从构想到现实自动化文档编写智能代码审查 提升创新能力&#xff1a;AI驱动的新常态模型驱动的设计思维 社区共享与合作知识共享的重要性 未来展望&#xff1a;AI与人类的…

<数据集>agv仓储机器人识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1514张 标注数量(xml文件个数)&#xff1a;1514 标注数量(txt文件个数)&#xff1a;1514 标注类别数&#xff1a;3 标注类别名称&#xff1a;[G1PB2000_Paleteira_AGVS BYD, G1RB5000, AGV-P] 序号类别名称图片数…

6自由度机械手DH坐标系建立

一、建立机械臂DH坐标系 Z为转动关节的转轴&#xff0c;Xi垂直于关节轴i和i1所在的平面&#xff0c;则根据上述方法可以建立坐标系如下图&#xff1a; 二、DH参数表 DH参数设定&#xff1a;机器人的每个连杆可以用4个运动学参数表示&#xff0c;DH法建立坐标系&#xff0c;xi-…

[开端]如何看待“低代码”开发平台的兴起

如何看待“低代码”开发平台的兴起&#xff1f; 近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0…

[开端]JAVA抽象类使用到redis观察着

一、绪论 当redis内容发生变化时需要通知一些观察者做一些动作怎么做&#xff1f; 二、JAVA抽象类 public abstract class AbstractRedisChangeListener {public abstract void change(String key, String value, String crudType); }使用abstract进行修饰一个类 其中抽象类…

SpringBoot中如何自定义自己的过滤器Filter(简易版)

本文不再说SpringMVC中的写法&#xff0c;毕竟现在项目都是SpringBoot&#xff0c;我们还是尽量使用SpringBoot的写法&#xff0c;首先了解一下Filter。 说白了&#xff0c;就是在请求到达服务器之前进行拦截&#xff0c;一般使用场景是拦截登录进行权限校验&#xff0c;当然一…

安装python+python的基础语法

安装python python2为内置&#xff0c;安装python3----3.6.8 最新安装3.12使用源码安装 1.查看yum源&#xff0c;epel [rootpython01 ~]# yum list installed |grep epel 2.安装python3 [rootpython01 ~]# yum -y install python3 3.查看版本 [rootpython01 ~]# python…

Android Studio Gradle多渠道打包

原理使用Android Studio打一次渠道包&#xff0c;用反编译工具反编译后&#xff0c;修改渠道信息重新编译 准备文件 分渠道配置文件&#xff1a;channel.txt ↓ # 多渠道配置里“统计平台”、“市场名称”、“渠道编号”分别代表什么意思&#xff1f; # 统计平台&#xff1a;…

AT32F421驱动BLDC 配合上位机控制与调参

AT32F421驱动BLDC 配合上位机控制与调参 &#x1f527;AT32 电机控制与调参上位机软件&#xff1a;ArteryMotorMonitor&#xff1a;https://www.arterytek.com/cn/support/motor_control.jsp?index0&#x1f33f;测试电机参数&#xff1a;2204-12N14P&#xff0c;无感BLDC&…

LVS(Linux Virtual Server)

简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个高性能的开源负载均衡解决方案&#xff0c;它通过在Linux内核中实现IPVS&#xff08;IP Virtual Server&#xff09;模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上&#xff0c…

百度文心一言API调用,千帆大模型获取API Key和API Secret图解

百度文心一言大模型调用教程&#xff0c;获取文心一言API Key和API Secret的方法&#xff0c;码笔记mabiji.com告诉大家在百度智能云的千帆大模型平台创建应用&#xff0c;即可获取文心一言的API Key和API Secret&#xff0c;详细流程如下&#xff1a; 1、在百度智能云的千帆大…

gitlab项目添加新成员

gitlab项目添加新成员 1、进入项目&#xff0c;找到settings----->点击Members 2、手动输入要添加成员的账号或者搜索&#xff0c;最后点击Add to project就可以了 choose a role permission 是为要添加的成员选择角色权限 补充&#xff1a; ‌Maintainer&#xff1a;拥…

同态加密和SEAL库的介绍(八)性能

本篇会对比三种加密方案&#xff0c;同时每种方案配置三种参数。即九种情况下的各个操作的性能差异&#xff0c;为大家选择合适的方案和合适的参数提供参考。表格中所有时长的单位均为微妙&#xff0c;即 。 当然数据量比较大&#xff0c;为了方便大家查找&#xff0c…

[BSidesCF 2019]Kookie1

打开题目&#xff0c;看到 根据提示&#xff0c;账号&#xff1a;cookie。密码&#xff1a;monster。试一下登录&#xff0c;登陆成功 抓包看看信息 根据提示&#xff0c; 看一下返回包 账号要加username要改成admin&#xff0c;改一下试试 构造cookie 直接得到flag flag{c…

Redis远程字典服务器(3)——常用数据结构和单线程模型

目录 一&#xff0c;常用数据结构 1.0 前言 1.1 string 1.2 hash 1.3 list 1.4 set 1.5 zset 1.6 演示 二&#xff0c;关于单线程模型 2.1 关于Redis的单线程 2.2 Redis为什么快 一&#xff0c;常用数据结构 1.0 前言 Redis是采用键值对的方式来存储数据的&#…

探索算法系列 - 前缀和算法

目录 一维前缀和&#xff08;原题链接&#xff09; 二维前缀和&#xff08;原题链接&#xff09; 寻找数组的中心下标&#xff08;原题链接&#xff09; 除自身以外数组的乘积&#xff08;原题链接&#xff09; 和为 K 的子数组&#xff08;原题链接&#xff09; 和可被 …