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

news2024/9/20 16:37:11

      全能开发套餐,轻松打造现代网站!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.js

import { 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.coloradmin.cn/o/1994774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

必看!全网最详细的仓库管理办法!

如今仓库管理的优劣直接影响着企业的运营效率和成本控制。一个高效、有序的仓库能够确保货物的及时供应&#xff0c;减少库存积压&#xff0c;提高客户满意度&#xff1b;而一个混乱、无序的仓库则可能导致货物丢失、损坏&#xff0c;延误交货&#xff0c;甚至影响企业的声誉和…

【宠粉赠书】Python数据可视化:科技图表绘制

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据可视化学习的必备书籍——《Python数据可视化&#xff1a;科技图表绘制》。下面我会详细给大家介绍这本书&#xff0c;文末留有领取方式。 图书介绍 《Python数据可视化&#xff1a;科技图表绘制》结合编者多年的数…

顶象文字点选模型识别

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为&#xff0c;本文只提供思路 如有侵犯&#xff0c;请联系作者下架 文字点选如何训练&#xff0c;之前的文章说了很多遍了&#xff0c;这里只放现成的模型供查看&#xff0c;有需要成品联系…

datax做增量导入数据到hive:mysql>hive

为什么要做增量导入? 例如mysql表中的数据导入hive&#xff0c;如果第一天抽取了mysql中t_user表中的全部数据&#xff0c;则第二天只需要抽取新增数据即可&#xff01; 增加导入是利用where 条件查询实现的&#xff0c;查询条件一般是自增的id或者时间列 下面演示基于时间列的…

sns.regplot()用法

概念 seaborn.regplot&#xff08;&#xff09;函数可以在两个变量之间绘制一个线性回归模型&#xff0c;可以输出线性回归线以及数据的散点图。 参数解释 seaborn.regplot(dataNone, xNone, yNone, x_estimatorNone, x_binsNone, x_cici, scatterTrue, fit_regTrue, ci95, …

s7_200smart采集遇到的问题

对s7_200smart(plc设备不太熟悉)第一次使用了modbus协议来采集数据是采集不到bcd码类型的数据&#xff0c;modbus里面不支持这个数据类型。采用西门子类型来设置采集数据也遇到不少问题&#xff1f; 第一&#xff1a;采集速率不可以太高&#xff0c;最好1秒一次&#xff0c;通…

YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

我们终究会懂得自己并非无所不能

今天参加“全民健身日”公开水域游泳比赛&#xff0c;第一次在游泳上有一种无力感。 以前以为自己游泳怎么都不会累&#xff0c;大不了踩踩水&#xff0c;或者在水上漂着。今天竟然途中可耻地抱着“跟屁虫”休息了。 是不是承认自己的无能&#xff0c;也是一种进步&#xff1f;…

【简历】苏州某大学211硕士:25届Java简历指导通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届211硕士同学的Java简历&#xff0c;这个学历他的目标必然是冲大厂。 不过他的简历几乎没什么提问点&#xff0c;211在大厂…

1.2 C 语言环境:MinGW 与 CLion 的安装与配置

目录 1 C 语言的由来 2 安装 MinGW 编译器 3 Windows 中安装 CLion 开发环境 3.1 安装 CLion 开发环境 3.2 运行试用 30 天 3.3 新建项目​ 3.4 汉化 4 Mac 中安装 Clion 开发环境 4.1 安装 CLion 开发环境 4.2 运行试用 30 天 4.3 新建项目 ​4.4 汉化 5 向日葵的…

【Linux】系列入门摘抄笔记-6-tar打包压缩和vim编辑器

打包、压缩和解压命令 压缩文件一定要严格区分扩展名 tar 打包程序 tar [主选项+辅选项] [包名] [目标文件或目录]描述:tar命令是Linux下最常用的打包程序。使用tar命令打出来的包称为tar包,因为tar包文件的后缀通常是“.tar”。 每条tar命令只能有一个主选项,而辅助选项…

C语言实现-排序1

文章目录 &#x1f3af;引言&#x1f453;排序1.排序的概念以及运用1.1概念1.2运用1.3常见的排序算法 2.排序算法的实现2.1插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序2.2.2堆排序 &#x1f947;结语 &#x1f3af;引言 欢迎来到HanLop博客的C语言数…

C#如何对某个词在字符串中出现的次数进⾏计数(LINQ)

文章目录 基础知识实现方法基础计数LINQ优化处理标点符号总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#和VB.NET中强大的查询语言&#xff0c;它可以用来查询集合、SQL数据库、XML文档等。在C#中&#xff0c;我们可以使用LINQ来简化对字符串中特定单词出现次…

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…

基于SpringBoot+Vue的供应商管理系统(带1w+文档)

基于SpringBootVue的供应商管理系统(带1w文档) 基于SpringBootVue的供应商管理系统(带1w文档) 现今&#xff0c;互联网在我们的日常生活占据着日益重要的地位&#xff0c;我们也越来越离不开对移动设备、电脑等上网设备的使用。传统的供应商管理系统模式主要依靠管理人员纯手工…

PyQt6简易案例代码GUI界面小工具——实现二维码生成器+自定义前后背景色(练手正合适)

目录 专栏导读PyQt6的介绍PyQt6的主要特点包括&#xff1a;使用PyQt6开发应用程序的一般步骤&#xff1a; 库的安装1、初始化与界面设计2、设置前景色、背景色功能完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双…

IP地址的构成

1. IPv4地址 IPv4地址是最早且目前仍然广泛使用的IP地址版本。由32位二进制数构成&#xff0c;应为32为二进制数太长了&#xff0c;所以我们通常用四个十进制数字来表示&#xff0c;每个数字之间用”.”分隔。这些数字的范围是0到255。IPv4地址的格式为&#xff1a; “A.B.C.…

2024世界机器人大会将于8月21日至25日在京举行

2024年的世界机器人大会预定于8月21日至25日&#xff0c;在北京经济技术开发区的北人亦创国际会展中心隆重举办。 本届大会以“共育新质生产力 共享智能新未来”为核心主题&#xff0c;将汇聚来自全球超过300位的机器人行业专家、国际组织代表、杰出科学家以及企业家&#xff0…

再启新征程——灵川县“灵秀山川”区域公共品牌发布会顺利举办

灵川县&#xff0c;自古便享有“楚越通衢&#xff0c;风气之先”的美誉&#xff0c;见证了无数文化的交流与融合。这里&#xff0c;土地肥沃&#xff0c;资源丰富&#xff0c;如同大自然的无尽宝库&#xff0c;孕育了琳琅满目的优质农特产品。立足于本地优势资源&#xff0c;灵…

Python | Leetcode Python题解之第329题矩阵中的最长递增路径

题目&#xff1a; 题解&#xff1a; class Solution:DIRS [(-1, 0), (1, 0), (0, -1), (0, 1)]def longestIncreasingPath(self, matrix: List[List[int]]) -> int:if not matrix:return 0rows, columns len(matrix), len(matrix[0])outdegrees [[0] * columns for _ in…