Mac快速搭建前端环境创建前端项目【Vue】

Mac快速搭建前端环境&创建前端项目

官网:

  1. vue:https://cn.vuejs.org/
  2. vue-router:https://www.axios-http.cn/
  3. pinia:https://pinia.vuejs.org/zh/getting-started.html
  4. axios:https://www.axios-http.cn/
  5. ant-design:https://www.antdv.com/

1 开发环境搭建

①安装node(nvm)

下载:https://nodejs.org/en
Mac可以安装配置nvm(管理node的工具)

  • https://github.com/nvm-sh/nvm
  • 如果安装过程中出现443,表明可能被墙了
  • 解决:打开网站https://www.ipaddress.com/
    查询一下 raw.githubusercontent.com对应的IP 地址,然后修改本机的vim /etc/hosts文件
185.199.108.133  raw.githubusercontent.com
### nvm安装及使用
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash# 配置环境变量
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"# 完成后输入nvm,出现node version manger表示安装成功
nvm# 使用:
## 1 安装node( nvm ls-remote  | grep 18 查看有哪些node版本)
nvm install 13.0.1
## 2 查看是否安装成功
nvm list | grep 13
## 3 切换版本
nvm use 13.0.1

在这里插入图片描述

②配置npm

# 配置npm
npm config set registry https://registry.npmmirror.com  #设置国内阿里云镜像源
npm config get registry  #查看镜像源npm init: 项目初始化;
npm init -y:默认一路yes,不用挨个输入信息
npm install 包名:安装js包到项目中(仅当前项目有效)。指定 包名,或者 包名@版本号
npm install -g: 全局安装,所有都能用
可以去 npm仓库 搜索第三方库
npm update 包名:升级包到最新版本
npm uninstall 包名:卸载包
npm run:项目运行

③安装vite(脚手架)

vite:快速创建前端项目脚手架。包括react、vue等项目
官网:https://cn.vitejs.dev

npm create vite #根据向导选择技术栈npm install #安装项目所有依赖npm install axios #安装指定依赖到当前项目
npm install -g xxx # 全局安装# 项目启动
npm run dev #启动项目# 项目打包
## 前后分离方式:需要把 dist 文件夹内容部署到如 nginx 之类的服务器上。
## 前后不分离方式:把 dist 文件夹内容复制到 SpringBoot 项目 resources 下面
npm run build #构建后 生成 dist 文件夹

在这里插入图片描述

问题:如果出现报错:node:77305) Warning: require() of ES modules is not supported.,表明node版本过低不支持。通过nvm升级node版本即可。nvm use v18.20.2

④vue浏览器插件:Vue.js devtools

在这里插入图片描述
使用:
在这里插入图片描述

⑤VSCode/WebStorm

  • VSCode官网(轻量级):https://code.visualstudio.com/Download
    在这里插入图片描述
  • WebStorm官网:https://www.jetbrains.com/webstorm/download/#section=mac
    在这里插入图片描述

2 快速搭建简易登录页面

使用技术:vue+vue-router-pinia+axios+ant-design
官网:

  1. vue:https://cn.vuejs.org/
  2. vue-router:https://www.axios-http.cn/
  3. pinia:https://pinia.vuejs.org/zh/getting-started.html
  4. axios:https://www.axios-http.cn/
  5. ant-design:https://www.antdv.com/

🚀全部代码:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/front_demo/vue/vue-all

2.1 创建vue项目

①vite创建vue基础项目
# 创建vue项目
npm create vite
# 进入项目并安装依赖
cd vue-all
npm install# 启动项目
npm run dev

在这里插入图片描述

②引入ant-design
//安装依赖
npm i --save ant-design-vue@4.x//main.js中注册使用
import { createApp } from 'vue';
import App from './App';
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/reset.css';const app = createApp(App);app.use(Antd).mount('#app');

2.2 使用ant-design快速搭建页面

在这里插入图片描述

①vue及路由配置
App.vue
<script>
</script><template><div><router-view/></div>
</template><style scoped>
</style>
views/LoginVue.vue
<script>
import {login} from "@/api/user.js";
export default {data() {return {loginUser: {username: 'admin',password: 'admin',},};},methods: {userLogin(){login(this.loginUser).then(res => {console.log(res.status)if(res.status === 200){alert('登录成功')this.$router.push({path: `/userInfo/`})}}, error => {alert('登录失败')})}},
}
</script><template><div class="loginContainer"><div class="loginHeader"><span style="color: #2b92e4">ziyi后台管理系统</span></div><div class="loginMainWrapper"><div class="loginWrapper"><div class="loginTipsWrapper" style="color: #ffffff"><span class="siteSummaryTitle">ziy后台管理系统</span><div class="siteSummary"><ul><li><a-icon type="check-square" style="margin-right: 10px"/><span>统一方便的资源管理</span></li><li><a-icon type="check-square" style="margin-right: 10px"/><span>友好的界面展示,基于AntDesign组件库</span></li><li><a-icon type="check-square" style="margin-right: 10px"/><span>前后端分离,便于维护</span></li></ul></div></div><div class="loginBoxWrapper" align="center"><a-form-model :model="loginUser" style="width: 100%"><a-form-model-item style="color: palevioletred;text-align: center"><h1>欢迎登录</h1></a-form-model-item><a-form-model-item><a-input v-model:value="loginUser.username" placeholder="账号"><a-icon slot="prefix" type="user" style="color:rgba(0,0,0,.25)"/></a-input></a-form-model-item><a-form-model-item><a-input v-model:value="loginUser.password" type="password" placeholder="密码"><a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)"/></a-input></a-form-model-item><a-form-model-item></a-form-model-item><a-form-model-item><a-button type="primary" html-type="submit" style="width: 100%" @submit.prevent@click="userLogin">立即登录</a-button><a-button style="width: 100%;margin-top: 10px">注册账号</a-button></a-form-model-item><a-form-model-item style="text-align: center"><a-space size="large"><a-icon type="weibo" style="font-size: 2em;cursor: pointer;color:#f50"/><a-icon type="qq" style="font-size: 2em;cursor: pointer;color:#2b92e4;"/><a-icon type="github" style="font-size: 2em;cursor: pointer;color:#333;"/></a-space></a-form-model-item></a-form-model></div></div><div class="loginFooter">© 2020-2024 CoreCmd 版权所有. 川ICP备18063315-1 川公网安备 52158202001416</div></div></div>
</template><style scoped>
.loginContainer {width: 100%;position: relative;background-attachment: fixed;background-repeat: no-repeat !important;background-size: cover;background-position: center;padding-top: 105px;min-height: 100%;
}.loginHeader {width: 100%;height: 64px;background-color: #ffffff;position: fixed;left: 0;right: 0;top: 0;z-index: 1000;box-shadow: 0 2px 15px rgba(0, 0, 0, .2);display: flex;align-items: center;justify-content: flex-start;flex-direction: row;padding: 10px;
}.loginHeader span {font-size: 25px;font-weight: 700;
}.loginMainWrapper {width: 100%;display: flex;justify-content: space-between;flex-direction: column;align-items: center;
}.loginWrapper {width: 90%;display: flex;align-items: flex-start;justify-content: right;flex-direction: row;height: 100%;
}.loginFooter {width: 100%;min-height: 64px;display: flex;justify-content: center;align-items: flex-start;flex-direction: row;text-align: center;color: #ffffff;margin-top: 40px;
}.siteSummary ul {list-style: none;padding: 0;
}.siteSummary ul li {margin-top: 10px;list-style: none;
}@media screen and (min-width: 1200px) {.loginTipsWrapper {padding: 20px 30px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;min-height: 100%;}.loginBoxWrapper {background-color: #ffffff;padding: 20px;width: 400px;height: 100%;border-radius: 5px;}
}@media screen and (min-width: 769px) and (max-width: 1200px) {.loginTipsWrapper {padding: 20px 30px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;height: 100%;}.loginBoxWrapper {background-color: #ffffff;padding: 20px;width: 400px;height: 100%;border-radius: 5px;}
}@media screen and (max-width: 768px) {.loginTipsWrapper {display: none;}.loginBoxWrapper {background-color: #ffffff;padding: 20px;width: 100%;border-radius: 5px;}
}.siteSummaryTitle {color: #ffffff;font-size: 1.5rem;font-weight: 700;
}.siteSummary {margin-top: 25px;color: #ffffff;font-size: 1.2rem;font-weight: 300;
}
</style>
views/UserInfo.vue
<script setup></script><template><h1>用户中心</h1>
</template><style scoped></style>
router/index.js
import {createRouter, createWebHistory} from 'vue-router'
import UserInfo from "@/views/UserInfo.vue";
import LoginVue from "@/views/LoginVue.vue";const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/', //默认展示登录页面name: 'login',component: LoginVue,},{path: '/userInfo',name: 'userInfo',component: UserInfo,}]
})export default router
②封装axios(util/http.js)
import axios from "axios";//封装请求
const http = axios.create({baseURL: '/api',timeout: 5000,headers: {'Content-Type': 'application/json;charset=UTF-8'},withCredentials:true, //允许跨域
});function get(url, params = {}) {return new Promise((resolve, reject) => {http.get(url, {params: params}).then(res => {resolve(res.data);}).catch(err => {reject(err.data)})})
}function post(url, data = {}) {return new Promise((resolve, reject) => {http.post(url, data).then(response => {resolve(response.data);}).catch(err => {reject(err)})})
}export default http;
③user.js
import http from '../utils/http.js'export const login = (params) => http.post(`/login`, params)

2.4 vite.config.js解决跨域

import {fileURLToPath, URL} from 'node:url'import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}},//配置代理server: {proxy: {'/api': {target: 'http://localhost:8080', // 后端服务器地址changeOrigin: true, // 是否改变请求域名rewrite: (path) => path.replace(/^\/api/, '')//将原有请求路径中的api替换为''}}}
})

2.4 后端接口(Golang版)

为了代码简洁,这里直接使用硬编码,不再进行连接查询数据库等操作

package mainimport ("fmt""github.com/kataras/iris/v12""github.com/kataras/iris/v12/context""net/http"
)func main() {app := iris.New()app.Use(Cors)app.Post("/login", login())app.Listen(":8080")
}func login() func(ctx *context.Context) {return func(ctx *context.Context) {tmp := make(map[string]interface{})err := ctx.ReadJSON(&tmp)if err != nil {ctx.StatusCode(http.StatusBadRequest)return}username := tmp["username"]password := tmp["password"]fmt.Println("username:", username, "password:", password)if username == "admin" && password == "admin" {ctx.StatusCode(http.StatusOK)return} else {ctx.StatusCode(http.StatusForbidden)return}}
}func Cors(ctx iris.Context) {//后端解决跨域ctx.Header("Access-Control-Allow-Origin", "*")if ctx.Method() == "OPTIONS" {ctx.Header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH,OPTIONS")ctx.Header("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization")ctx.StatusCode(204)return}ctx.Next()
}

2.5 测试

①启动项目
# 在package.json目录下执行命令,运行前端
npm run dev# 启动后端
go run main.go

前端:
在这里插入图片描述

后端:
在这里插入图片描述

②验证
  1. 访问浏览器
    在这里插入图片描述
  2. 点击登录按钮,请求后端
    在这里插入图片描述
  3. 登录成功,跳转用户中心页面
    在这里插入图片描述

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

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

相关文章

Advanced Installer 问题集锦

1、界面在主题中显示的图标&#xff0c;如logo、发布者名称、产品名称就算在设计界面时删除&#xff0c;但是下次打开工程依然存在 解决办法&#xff1a;“可见”属性设置为禁用 2、在不关闭软件的情况下&#xff0c;使用"文件->打开"来切换项目&#xff0c;再次…

学习笔记——数据通信基础——数据通信网络(基本概念)

数据通信网络基本概念 网络通信&#xff1a;是指终端设备之间通过计算机网络进行的通信。 数据通信网络(Data Communication Network)&#xff1a;由 路由器、交换机、防火墙、无线控制器、无线接入点&#xff0c;以及个人电脑、网络打印机&#xff0c;服务器等设备构成的通信…

探秘GPT-4o:人工智能语言模型的新纪元

目录 前言1 GPT系列版本演变1.1 GPT-1到GPT-3的演变1.2 GPT-4的引入 2 GPT-4o与GPT-4的区别2.1 参数规模和架构优化2.2 训练数据和方法改进2.3 多模态能力 3 GPT-4o在语言生成和理解方面的技术能力3.1 更自然的语言生成3.2 更深刻的语境理解3.3 强大的跨语言能力3.4 自适应学习…

【Unity Shader入门精要 第11章】让画面动起来(一)

1. Unity Shader中的时间变量 Shader控制这物体的显示&#xff0c;当向Shader中引入时间变量后&#xff0c;就可以让物体的显示效果随时间发生变化&#xff0c;以实现动画效果。 Unity中常见的时间变量如下表&#xff1a; 变量类型描述_Timefloat4(t/20, t, 2t, 3t)&#xf…

打造高可用系统:深入了解心跳检测机制

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的技术小伙伴小米,今天咱们来聊聊分布式系统中的“心跳检测”机制。心跳检测是一种简单而又重要的机制,用来监控系统的…

如何实现虚拟列表?定高和不定高两种场景

之前我写了一篇文章&#xff1a;如何使用 IntersectionObserver API 来实现数据的懒加载 在文章的最后&#xff0c;我们提到如果加载的列表数据越来越多&#xff0c;我们不可能把所有的数据都渲染出来&#xff0c;因为这样会导致页面卡住甚至崩溃。 为了优化这种长列表场景&am…

WebPack插件实现:打包之后自动混淆加密JS文件

在WebPack中调用JShaman&#xff0c;实现对编译打包生成的JS文件混淆加密 一、插件实现 1、插件JShamanObfuscatorPlugin.js&#xff0c;代码&#xff1a; class JShamanObfuscatorPlugin { apply(compiler) { compiler.hooks.emit.tapAsync(JShamanObfuscatorPlugin, (comp…

浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 和上一题的思路一样&#xff0c;每进行一次迭代&#xff0c;来验证当前序列是否和给定的序列相同 代码展示 #include <cstdlib> #include <iostream> #define MAXSIZE 10…

【PHP小课堂】PHP中的网络组件相关函数

PHP中的网络组件相关函数 作为一门以 WEB 开发为主战场的编程语言来说&#xff0c;PHP 即使是在目前这个大环境下&#xff0c;依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件&#xff0c;而且它们都是不需要安装扩展就能够使用的。今天&a…

ubuntu-24.04系统静态Mac和IP配置

操作系统版本&#xff08;桌面版&#xff09;&#xff1a;ubuntu-24.04-desktop-amd64.iso 原因说明&#xff1a;因网络的IP地址和Mac是预分配的&#xff0c;所以ubuntu系统需要修改网卡的mac地址和IP才能访问&#xff0c;网络查了半天资料都没成功&#xff0c;后再界面提示&a…

网上书城|基于SprinBoot+vue的网上书城管理系统(源码+数据库+文档)

网上书城管理系统 目录 基于SprinBootvue的网上书城管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

NGINX完全指南_实现高性能负载均衡的进阶实操指南

欢迎阅读 2024 版《NGINX 完全指南》。OReilly 已连续九年出版《NGINX 完全指南》&#xff0c;我们不断进行更新以跟上 NGINX 做出的诸多改进。如今&#xff0c;NGINX 是全球最受欢迎的 Web 服务器。该产品于 2004 年首次发布&#xff0c;并不断发展&#xff0c;以满足现代应用…

【进阶篇】Midjourney如何最大限度精准控图,做到收放自如?

和朋友们一起玩MJ也已经快两个月了&#xff0c;从一开始的惊喜&#xff0c;到现在的平淡&#xff0c;大家都开始思考这个到底我们应该怎么用&#xff1f;而不是仅仅是为了满足自己对MJ本身的好奇心&#xff0c;以及生出一张美图时的那种喜悦感。 目前大家最多的疑问就是&#…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

搜索自动补全-elasticsearch实现

1. elasticsearch准备 1.1 拼音分词器 github地址&#xff1a;https://github.com/infinilabs/analysis-pinyin/releases?page6 必须与elasticsearch的版本相同 第四步&#xff0c;重启es docker restart es1.2 定义索引库 PUT /app_info_article {"settings": …

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

STM32F4_HAL_LWIP_RAM接口UDP实验

目录 RAW 的 UDP 接口简介 RAW 的 UDP 实验 硬件设计 例程功能 软件设计 UDP 配置步骤 软件设计流程图 RAW 的 UDP 接口简介 UDP 协议的 RAW 的 API 功能函数&#xff0c;我们使用这些函数来完成 UDP 的数据发送和接收功能。 (1) udp_new 函数 此函数用来创建一个 UDP …

如何用俄语预定酒店,柯桥外贸俄语培训

-Привет, Алекс! Как твои дела? 你好&#xff0c;阿列克斯&#xff01;你最近好吗&#xff1f; -Отлично! Я скоро уезжаю на 10 дней в Санкт-Петербург, но никак не могу найти там…

如何查询Windows 10电脑的IP地址

如何查询Windows 10电脑的IP地址 引言 在Windows 10操作系统中&#xff0c;查询电脑的IP地址是一项基本而重要的任务&#xff0c;无论是为了配置网络、解决连接问题&#xff0c;还是进行远程访问。 基础知识 IP地址&#xff1a;互联网协议地址&#xff0c;用于标识网络中的…