day07-vue项目-搭建项目到登录功能

文章目录

      • 1.电商业务概述
      • 2.项目初始化
      • 3.码云相关操作
        • B.安装git
        • D.在本地创建公钥:在终端运行:ssh-keygen -t rsa -C "xxx@xxx.com"
      • 4.配置后台项目
        • A.安装phpStudy并导入mysql数据库数据
        • B.安装nodeJS,配置后台项目,从终端打开后台项目vue_api_server
        • C.使用postman测试api接口
      • 5.实现登录功能
        • 概述
          • A.登录状态保持
          • B.登录逻辑
          • C.添加新分支login,在login分支中开发当前项目vue_shop
        • 进一步处理
          • A.添加element-ui的表单组件
          • B.添加第三方字体
          • C.添加表单验证的步骤
      • 6.登录成功之后的操作
        • A.登录成功之后,需要将后台返回的token保存到sessionStorage中
      • 补充
        • 关于ESlint配置文件

1.初始化项目
2.基于Vue技术栈进行项目开发
3.使用Vue的第三方组件进行项目开发
4.理解前后端分离开发模式

1.电商业务概述

image-20200817145210356

客户使用的业务服务:PC端,小程序,移动web,移动app
管理员使用的业务服务:PC后台管理端。

image-20200817145226409PC后台管理端的功能:管理用户账号(登录,退出,用户管理,权限管理),商品管理(商品分类,分类参数,商品信息,订单),数据统计

image-20200817145407544

电商后台管理系统采用前后端分离的开发模式
前端项目是基于Vue的SPA(单页应用程序)项目

image-20200817145424877

前端技术栈:Vue,Vue-Router,Element-UI,Axios,Echarts
后端技术栈:Node.js,Express,Jwt(模拟session),Mysql,Sequelize(操作数据库的框架)

2.项目初始化

image-20200817145440898

A.安装Vue脚手架
B.通过脚手架创建项目
C.配置路由
D.配置Element-UI:在插件中安装,搜索vue-cli-plugin-element
E.配置Axios:在依赖中安装,搜索axios(运行依赖)
F.初始化git仓库
G.将本地项目托管到github或者码云中

3.码云相关操作

A.注册登录码云账号

B.安装git

在Windows上使用Git,可以从Git官网直接下载安装程序进行安装。
测试命令:git --version

#C.点击网站右上角“登录”,登录码云,并进行账号设置

D.在本地创建公钥:在终端运行:ssh-keygen -t rsa -C “xxx@xxx.com”


E.找到公钥地址:
Your identification has been saved in /c/Users/My/.ssh/id_rsa.
Your public key has been saved in /c/Users/My/.ssh/id_rsa.pub.
当我们创建公钥完毕之后,请注意打印出来的信息“Your public key has been saved in”
/c/Users/My/.ssh/id_rsa.pub : c盘下面的Users下面的My下面的.ssh下面的id_rsa.pub就是我们创建好的公钥了

E.打开id_rsa.pub文件,复制文件中的所有代码,点击码云中的SSH公钥,将生成的公钥复制到公钥中


G.测试公钥:打开终端,输入命令
ssh -T git@gitee.com

H.将本地代码托管到码云中
点击码云右上角的+号->新建仓库

I.进行git配置:

打开项目所在位置的终端,进行git仓库关联

4.配置后台项目

image-20200817145509029

A.安装phpStudy并导入mysql数据库数据

B.安装nodeJS,配置后台项目,从终端打开后台项目vue_api_server

然后在终端中输入命令安装项目依赖包:npm install

C.使用postman测试api接口

5.实现登录功能

概述

image-20200817145523404

A.登录状态保持

​ 如果服务器和客户端同源,建议可以使用cookie或者session来保持登录状态
​ 如果客户端和服务器跨域了,建议使用token进行维持登录状态。

image-20200817154033019

B.登录逻辑

​ 在登录页面输入账号和密码进行登录,将数据发送给服务器
​ 服务器返回登录的结果,登录成功则返回数据中带有token
​ 客户端得到token并进行保存,后续的请求都需要将此token发送给服务器,服务器会验证token以保证用户身份。

image-20200817154052365

C.添加新分支login,在login分支中开发当前项目vue_shop

​ 打开vue_shop终端,使用git status确定当前项目状态。
​ 确定当前工作目录是干净的之后,创建一个分支进行开发,开发完毕之后将其合并到master
​ git checkout -b login
​ 然后查看新创建的分支:git branch

​ 确定我们正在使用login分支进行开发

然后执行vue ui命令打开ui界面,然后运行serve,运行app查看当前项目效果

发现现在是一个默认页面,我们需要进行更改,打开项目的src目录,点击main.js文件(入口文件)

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'Vue.config.productionTip = falsenew Vue({router,render: h => h(App)
}).$mount('#app')

再打开App.vue(根组件),将根组件的内容进行操作梳理(template中留下根节点,script中留下默认导出,去掉组件,style中去掉所有样式)

<template><div id="app"><router-view></router-view></div>
</template><script>
export default {name: 'app'
}
</script><style>
</style>

再打开router.js(路由),将routes数组中的路由规则清除,然后将views删除,将components中的helloworld.vue删除

import Vue from 'vue'
import Router from 'vue-router'Vue.use(Router)export default new Router({routes: []
})

在components文件夹中新建Login.vue组件,添加template,script,style标签,style标签中的scoped可以防止组件之间的样式冲突,没有scoped则样式是全局的

<template><div class="login_container"></div>
</template><script>
export default {}
</script><style lang="less" scoped>
.login_container {background-color: #2b5b6b;height: 100%;
}</style>

在router.js中导入组件并设置规则
在App.vue中添加路由占位符

const router = new Router({routes: [{ path: '/', redirect: '/login' },{ path: '/login', component: Login }]
})

当我们给Login.vue中的内容添加样式的时候,会报错“缺少less-loader”,需要配置less加载器(开发依赖),安装less(开发依赖)

然后需要添加公共样式,在assets文件夹下面添加css文件夹,创建global.css文件,添加全局样式

/* 全局样式表 */
html,body,#app{width: 100%;height: 100%;margin: 0;padding: 0; 
}

在main.js中导入global.css,使得全局样式生效 import “./assets/css/global.css”
然后Login.vue中的根元素也需要设置撑满全屏(height:100%)
最终Login.vue文件中的代码如下

<template><div class="login_container"><!-- 登录盒子  --><div class="login_box"><!-- 头像 --><div class="avatar_box"><img src="../assets/logo.png" alt=""></div><!-- 登录表单 --><el-form :model="loginForm" ref="LoginFormRef" :rules="loginFormRules" label-width="0px" class="login_form"><!-- 用户名 --><el-form-item prop="username"><el-input v-model="loginForm.username" prefix-icon="iconfont icon-user" ></el-input></el-form-item> <!-- 密码 --><el-form-item prop="password"><el-input type="password" v-model="loginForm.password" prefix-icon="iconfont icon-3702mima"></el-input></el-form-item> <!-- 按钮 --><el-form-item class="btns"><el-button type="primary" @click="login">登录</el-button><el-button type="info" @click="resetLoginForm">重置</el-button></el-form-item> </el-form></div></div>
</template><script>
export default {data() {return {//数据绑定loginForm: {username: 'admin',password: '123456'},//表单验证规则loginFormRules: {username: [{ required: true, message: '请输入登录名', trigger: 'blur' },{min: 3,max: 10,message: '登录名长度在 3 到 10 个字符',trigger: 'blur'}],password: [{ required: true, message: '请输入密码', trigger: 'blur' },{min: 6,max: 15,message: '密码长度在 6 到 15 个字符',trigger: 'blur'}]}}},//添加行为,methods: {//添加表单重置方法resetLoginForm() {//this=>当前组件对象,其中的属性$refs包含了设置的表单ref//   console.log(this)this.$refs.LoginFormRef.resetFields()},login() {//点击登录的时候先调用validate方法验证表单内容是否有误this.$refs.LoginFormRef.validate(async valid => {console.log(this.loginFormRules)//如果valid参数为true则验证通过if (!valid) {return}//发送请求进行登录const { data: res } = await this.$http.post('login', this.loginForm)//   console.log(res);if (res.meta.status !== 200) {return this.$message.error('登录失败:' + res.meta.msg) //console.log("登录失败:"+res.meta.msg)}this.$message.success('登录成功')console.log(res)//保存tokenwindow.sessionStorage.setItem('token', res.data.token)// 导航至/homethis.$router.push('/home')})}}
}
</script><style lang="less" scoped>
.login_container {background-color: #2b5b6b;height: 100%;
}
.login_box {width: 450px;height: 300px;background: #fff;border-radius: 3px;position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);.avatar_box {height: 130px;width: 130px;border: 1px solid #eee;border-radius: 50%;padding: 10px;box-shadow: 0 0 10px #ddd;position: absolute;left: 50%;transform: translate(-50%, -50%);background-color: #fff;img {width: 100%;height: 100%;border-radius: 50%;background-color: #eee;}}
}
.login_form {position: absolute;bottom: 0;width: 100%;padding: 0 20px;box-sizing: border-box;
}
.btns {display: flex;justify-content: flex-end;
}
</style>

其中我们有用到一下内容,需要进行进一步处理:

进一步处理

A.添加element-ui的表单组件

在plugins文件夹中打开element.js文件,进行elementui的按需导入

import Vue from 'vue'
import { Button } from 'element-ui'
import { Form, FormItem } from 'element-ui'
import { Input } from 'element-ui'Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
B.添加第三方字体

复制素材中的fonts文件夹到assets中,在入口文件main.js中导入import ‘./assets/fonts/iconfont.css’
然后直接在
接着添加登录盒子

C.添加表单验证的步骤

1).给添加属性:rules=“rules”,rules是一堆验证规则,定义在script、中
2).在script中添加rules:

export default{ data(){return{......, rules: {name: [{ required: true, message: '请输入活动名称', trigger: 'blur' },{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }],region: [{ required: true, message: '请选择活动区域', trigger: 'change' }]
}


3).通过的prop属性设置验证规则

vue.prototype和vue.use的区别和注意点

1、vue.prototype:实例上挂载属性/方法,例如Vue.prototype.axios = axios;

2、vue.use:引入插件,例如vuex,vue.use(vuex)

4.导入axios以发送ajax请求
打开main.js,import axios from ‘axios’;
设置请求的根路径:axios.defaults.baseURL = ‘http://127.0.0.1:8888/api/private/v1/’;
挂载axios:Vue.prototype.$http = axios;

5.配置弹窗提示:
在plugins文件夹中打开element.js文件,进行elementui的按需导入
import {Message} from ‘element-ui’
进行全局挂载:

Vue.prototype.$message = Message;

在login.vue组件中编写弹窗代码:

this.$message.error('登录失败')

6.登录成功之后的操作

A.登录成功之后,需要将后台返回的token保存到sessionStorage中

操作完毕之后,需要跳转到/home

login() {//点击登录的时候先调用validate方法验证表单内容是否有误this.$refs.LoginFormRef.validate(async valid => {console.log(this.loginFormRules)//如果valid参数为true则验证通过if (!valid) {return}//发送请求进行登录const { data: res } = await this.$http.post('login', this.loginForm)//   console.log(res);if (res.meta.status !== 200) {return this.$message.error('登录失败:' + res.meta.msg) //console.log("登录失败:"+res.meta.msg)}this.$message.success('登录成功')console.log(res)//保存tokenwindow.sessionStorage.setItem('token', res.data.token)// 导航至/homethis.$router.push('/home')})}

添加一个组件Home.vue,并为之添加规则

<template><div>this is home<el-button type="info" @click="logout"> 退出 </el-button></div>
</template><script>
export default {methods: {logout() {window.sessionStorage.clear()this.$router.push('/login')}}
}
</script><style lang='less' scoped>
</style>

添加路由规则

const router = new Router({routes: [{ path: '/', redirect: '/login' },{ path: '/login', component: Login },{ path: '/home', component: Home }]
})

image-20200818111335878

添加路由守卫
如果用户没有登录,不能访问/home,如果用户通过url地址直接访问,则强制跳转到登录页面
打开router.js

import Vue from 'vue'
import Router from 'vue-router'
import Login from './components/Login.vue'
import Home from './components/Home.vue'Vue.use(Router)const router = new Router({routes: [{ path:'/', redirect:'/login'},{ path:'/login' , component:Login },{ path:'/home' , component:Home}]
})//挂载路由导航守卫,to表示将要访问的路径,from表示从哪里来,next是下一个要做的操作
router.beforeEach((to,from,next)=>{ if(to.path === '/login')return next();//获取tokenconst tokenStr = window.sessionStorage.getItem('token');if(!tokenStr)return next('/login');next();})export default router 

实现退出功能

image-20200818112335781在Home组件中添加一个退出功能按钮,给退出按钮添加点击事件,添加事件处理代码如下:

export default {methods:{logout(){window.sessionStorage.clear();this.$router.push('/login');}}
}

补充

A.处理ESLint警告
打开脚手架面板,查看警告信息
image-20200818114212129
默认情况下,ESLint和vscode格式化工具有冲突,需要添加配置文件解决冲突。
在项目根目录添加 .prettierrc 文件

{"semi":false,"singleQuote":true
}

打开.eslintrc.js文件,禁用对 space-before-function-paren 的检查:

  rules: {'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off','no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off','space-before-function-paren' : 0},

B.合并按需导入的element-ui

import Vue from 'vue'
import { Button, Form, FormItem, Input, Message } from 'element-ui'Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
// 进行全局挂载:
Vue.prototype.$message = Message

关于ESlint配置文件

ESlint配置文件eslintrc.js详解
https://www.cnblogs.com/taoshengyijiuai/p/8431413.htmlVue中ESlint配置文件eslintrc.js文件详解
https://blog.csdn.net/weixin_38606332/article/details/80864381module.exports = {//此项是用来告诉eslint找当前配置文件不能往父级查找root: true, //此项是用来指定eslint解析器的,解析器必须符合规则,babel-eslint解析器是对babel解析器的包装使其与ESLint解析parser: 'babel-eslint',//此项是用来指定javaScript语言类型和风格,sourceType用来指定js导入的方式,默认是script,此处设置为module,指某块导入方式parserOptions: {sourceType: 'module'},//此项指定环境的全局变量,下面的配置指定为浏览器环境env: {browser: true,},// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style// 此项是用来配置标准的js风格,就是说写代码的时候要规范的写,如果你使用vs-code我觉得应该可以避免出错extends: 'standard',// required to lint *.vue files// 此项是用来提供插件的,插件名称省略了eslint-plugin-,下面这个配置是用来规范html的plugins: ['html'],// add your custom rules here// 下面这些rules是用来设置从插件来的规范代码的规则,使用必须去掉前缀eslint-plugin-// 主要有如下的设置规则,可以设置字符串也可以设置数字,两者效果一致// "off" -> 0 关闭规则// "warn" -> 1 开启警告规则//"error" -> 2 开启错误规则// 了解了上面这些,下面这些代码相信也看的明白了'rules': {// allow paren-less arrow functions'arrow-parens': 0,// allow async-await'generator-star-spacing': 0,// allow debugger during development'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0}
}

C.将代码提交到码云
新建一个项目终端,输入命令‘git status’查看修改过的与新增的文件内容
将所有文件添加到暂存区:git add .
将所有代码提交到本地仓库:git commit -m “添加登录功能以及/home的基本结构”
查看分支: git branch 发现所有代码都被提交到了login分支
将login分支代码合并到master主分支,先切换到master:git checkout master
在master分支进行代码合并:git merge login
将本地的master推送到远端的码云:git push

​ 推送本地的子分支到码云,先切换到子分支:git checkout 分支名
​ 然后推送到码云:git push -u origin 远端分支名

扩展:解决无法推送至远程分支

完美解决:error: failed to push some refs to ‘https://github.com/xxxx.git’

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

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

相关文章

SSE,MSE,RMSE,R-square指标讲解

SSE(和方差、误差平方和)&#xff1a;The sum of squares due to errorMSE(均方差、方差)&#xff1a;Mean squared errorRMSE(均方根、标准差)&#xff1a;Root mean squared errorR-square(确定系数)&#xff1a;Coefficient of determinationAdjusted R-square&#xff1a;D…

互联互通下的超级App价值重构

来源&#xff1a;虎嗅APP题图&#xff1a;视觉中国站在岁末回看&#xff0c;这过去的一年&#xff0c;发生了无数影响深远的事件&#xff1a;反垄断政策落地、用户存量争夺愈演愈烈、商业创新乏力……互联网人突然发现&#xff0c;以往基于流量的增长打法逐渐失灵。与此同时&am…

WCF进阶:将编码后的字节流压缩传输

在前面两篇文章WCF进阶&#xff1a;将消息正文Base64编码和WCF进阶:为每个操作附加身份信息中讲述了如何通过拦截消息的方式来记录或者修改消息&#xff0c;这种方式在特定条件下可以改变消息编码格式&#xff0c;但实现方式并不规范&#xff0c;而且使用范围也有限制。 WCF缺省…

物理学四大神兽,除了“薛定谔的猫”, 你还知道哪几个?

来源 &#xff1a; 逗逼的500T硬盘物理学是一门研究物质运动最一般规律和物质基本结构的学科。分为纯物理学和多学科物理学&#xff0c;其中的纯物理学又分为&#xff1a;1.经典力学&#xff1b;2.热力学和统计力学&#xff1b;3.电磁学&#xff1b;4.相对论&#xff1b;5.量子…

JDBC-01-快速入门

文章目录01 JDBC快速入门02 JDBC各个类详解03 JDBC之CRUD练习04 ResultSet类详解05 JDBC登录案例练习抽取JDBC工具类 &#xff1a; JDBCUtils练习06 PreparedStatement类详解07 JDBC事务管理目标 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解 01 JDBC快速入门 1…

研究速递:预测学习——神经元高效运作的最佳策略

来源&#xff1a;集智俱乐部作者&#xff1a;袁郭玲、梁金编辑&#xff1a;邓一雪摘要了解大脑如何学习有助于制造具有与人类类似智力水平的机器。之前有理论提出&#xff0c;大脑可能是根据预测编码的原理运行。然而&#xff0c;对于预测系统如何在大脑中实现还没有很好的解释…

破解人工智能系统的四种攻击方法!

来源&#xff1a;未来科技前沿没有人喜欢早上起床&#xff0c;但现在人工智能驱动的算法可以设置我们的闹钟、管理我们家中的温度设置以及选择适合我们心情的播放列表&#xff0c;贪睡按钮的使用越来越少。人工智能安全辅助系统使我们的车辆更安全&#xff0c;人工智能算法优化…

PowerDesigner-快速入门(极简教程)

文章目录3. PowerDesigner3.1 PowerDesigner介绍3.2 PowerDesigner使用3.2.1 创建物理数据模型3.2.2 从PDM导出SQL脚本3.2.3 逆向工程3.2.4 生成数据库报表文件3. PowerDesigner 3.1 PowerDesigner介绍 PowerDesigner是Sybase公司的一款软件&#xff0c;使用它可以方便地对系…

关于dev无法更新、调试的问题

转载于:https://www.cnblogs.com/IcefishBingqing/p/5109876.html

MIT发布白皮书:美国欲重返世界半导体霸主!

来源&#xff1a;新智元编辑&#xff1a;时光 David近年来&#xff0c;全球芯片的持续性短缺已引发了一连串的产能瓶颈问题。各种消费品的价格都随着「缺芯」而上升&#xff0c;从CPU到显卡&#xff0c;从智能冰箱到SUV&#xff0c;这凸显出半导体在日常生活种所扮演的重要作用…

dubbo-快速入门-分布式RPC框架Apache Dubbo

文章目录分布式RPC框架Apache Dubbo1. 软件架构的演进过程1.1 单体架构1.2 垂直架构1.3 SOA架构1.4 微服务架构2. Apache Dubbo概述2.1 Dubbo简介2.2 Dubbo架构3. 服务注册中心Zookeeper3.1 Zookeeper介绍3.2 安装Zookeeper3.3 启动、停止Zookeeper4. Dubbo快速入门4.1 服务提供…

可构建AI的“AI”诞生:几分之一秒内,就能预测新网络的参数

来源&#xff1a;学术头条 作者&#xff1a;Anil Ananthaswamy译者&#xff1a;刘媛媛原文出处&#xff1a;quantamagazine.org人工智能在很大程度上是一场数字游戏。当深度神经网络在 10 年前开始超越传统算法&#xff0c;是因为我们终于有了足够的数据和处理能力来充分利用它…

linux-01-概述

文章目录入门概述走近Linux系统入门概述 我们为什么要学习Linux linux诞生了这么多年&#xff0c;以前还喊着如何能取代windows系统&#xff0c;现在这个口号已经小多了&#xff0c;任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样&#xff0…

MySQL-Front的安装简介

本博文在作者的个人网站、博客园和CSDN同步发表&#xff0c;如要转载&#xff0c;请标明原作者和出处。 最近在学习MySQL数据库&#xff0c;开始的时候使用的Windows的命令行进行最基本的代码的输入&#xff0c;可是后来就觉得比较麻烦了&#xff0c;于是想找一款图形化数…

生命是什么?生物化学、物理学、哲学对生命本源的共同探索

来源&#xff1a; 集智俱乐部作者&#xff1a;Mark A. Bedua译者&#xff1a;宋词、范星辰 审校&#xff1a;周理乾、梁金编辑&#xff1a;邓一雪导语地球上充盈着生命&#xff0c;通常我们很容易分辨哪些是生命&#xff0c;哪些不是生命。可是&#xff0c;关于生命是什么&…

linux-02-常用的命令-必须掌握

文章目录目录管理基本属性文件内容查看目录管理 绝对路径和相对路径 我们知道Linux的目录结构为树状结构&#xff0c;最顶级的目录为根目录 /。 其他目录通过挂载可以将它们添加到树中&#xff0c;通过解除挂载可以移除它们。 在开始本教程前我们需要先知道什么是绝对路径与相…

上交大许志钦:神经网络中的奥卡姆剃刀——简单有效原理

来源&#xff1a; 智源社区作者&#xff1a;许志钦整理&#xff1a;熊宇轩编辑&#xff1a;李梦佳本文整理自青源Talk第十期&#xff0c;视频回看地址&#xff1a;https://event.baai.ac.cn/activities/217【专栏&#xff1a;研究思路】奥卡姆剃刀是由14世纪方济会修士奥卡姆的…

linux-03-Vim使用+账号用户管理

什么是Vim编辑器 Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则…

孙正义:未来30年投资趋势【附PPT】

来源&#xff1a;投资家、蓝血研究&#xff08;lanxueyanjiu)作者&#xff1a;孙正义对于今后30年来讲&#xff0c;我认为现在是个很关键的时刻&#xff0c;尤其是在各位的人生当中。而且现在是一整个概念的转变&#xff0c;我们要包容这个概念的转变。我想先给大家看两张照片。…

linux-04-磁盘命令+进程命令

磁盘管理 概述 Linux磁盘管理好坏直接关系到整个系统的性能问题。 Linux磁盘管理常用命令为 df、du。 df &#xff1a;列出文件系统的整体磁盘使用量du&#xff1a;检查磁盘空间使用量 df df df命令参数功能&#xff1a;检查文件系统的磁盘空间占用情况。可以利用该命令来获…