根据Vue.js + Element UI + MongoDB进行开发

P1 安装Vue-CLI
Vue.js文档
利用Vue.js提供的一个官方命令行工具
# 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project # 安装依赖,走你 $ cd my-project $ npm install $ npm run dev
Vue.js 主要目录结构
. ├── build # 一些webpack的文件,配置参数什么的,一般不用动 ├── config # vue项目的基本配置文件 ├── index.html # 主页 ├── node_modules # 项目中安装的依赖模块 ├── package.json # 项目文件,记载着一些命令和依赖还有简要的项目描述信息 ├── README.md ├── server # 自己创建的后端文件,可以忽视 ├── src # 源码文件夹,基本上文件都应该放在这里 ├── App.vue # App.vue组件 ├── assets # 资源文件夹,里面放一些静态资源 ├── components # 这里放的都是各个组件文件 ├── main.js # 入口文件 └── router # vue-router 路由配置 ├── static # 生成好的文件会放在这个目录下 ├── test # 测试文件夹,测试都写在这里 ├── .babelrc # babel编译参数,vue开发需要babel编译 ├── .gitignore └── .eslintignore
完成后就可以在/src/components/*.vue模板中写代码,ctrl+s保存后页面会自动刷新,若无效请检查端口是否被占用
P2 安装Element UI
Element UI文档
npm i element-ui -S
完成后在main.js中添加如下代码完整引入Element,就能在/src/components/*.vue模板中使用Element UI的组件
// main.js import ElementUI from 'element-ui' import 'element-ui/lib/theme-default/index.css' Vue.use(ElementUI)
P3 登录注册功能
思路
验证输入的账号和密码是否合法(利用elementui的form表单)
export default {
name: 'register',
data () {
var validateUser = (rule, value, cb) => {
var pattern = /^[\w\u4e00-\u9fa5]{3,10}$/g
if (value === '') {
cb(new Error('请输入用户名'))
} else if (!pattern.test(value)) {
cb(new Error('请输入3-10个字母/汉字/数字/下划线'))
} else {
cb()
}
}
var validatePwd = (rule, value, cb) => {
var pattern = /^\S{3,20}$/g
if (value === '') {
cb(new Error('请输入密码'))
} else if (!pattern.test(value)) {
cb(new Error('请输入3-20个非空白字符'))
} else {
if (this.registerForm.checkPwd !== '') {
this.$refs.registerForm.validateField('checkPwd')
}
cb()
}
}
var validateCheckPwd = (rule, value, cb) => {
if (value === '') {
cb(new Error('请再次输入密码'))
} else if (value !== this.registerForm.pwd) {
cb(new Error('两次输入密码不一致!'))
} else {
cb()
}
}
return {
registerForm: {
userName: '',
pwd: '',
checkPwd: ''
},
registerRule: {
userName: [
{ validator: validateUser, trigger: 'blur' }
],
pwd: [
{ validator: validatePwd, trigger: 'blur' }
],
checkPwd: [
{ validator: validateCheckPwd, trigger: 'blur' }
]
}
}
},
methods: {
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
...
} else {
return false
}
})
}
}
}
利用axios实现与后端数据的交互
axios文档
Axios.post('http://localhost:3000/register', data)
.then(res => {
console.log(res.data)
if (res.data.code === 0) {
this.$message({
showClose: true,
message: '注册成功',
type: 'success'
})
router.push({name: 'Login'})
} else {
this.$message({
showClose: true,
message: '注册失败',
type: 'error'
})
}
})
使用 JSON WEB Tokens 实现登录验证
由于node后端和vue前端是两个不同的端口(:3000和:8090),对于跨域(我已经允许跨域访问),session和cookie就不要想了,并不是设置一个什么就能解决的,花了一下午才发现,所以使用了token来做api请求,而且还能加密。
后端处理登录
// sever/db/dbHelper.js
exports.findUser = function(data, cb) {
User.findOne({
username: data.usr
}, function(err, doc) {
// 用户密码都正确
// jwt.encode({加密对象, 持续时间}, 密钥字符串)
entries.data = user
entries.code = 0
var time = moment().add(1, 'days').valueOf()
entries.access_token = jwt.encode({
iss: user._id,
exp: time
}, jwtTokenSecret)
cb(true, entries)
})
}
加密后的entries.access_token:
前端获取到后端传递过来的access_token,将其保存进sessionStorage。这个导航钩子我放在/p路由独享的钩子下,在进入/p/:id前拦截导航,通过axios向后端传递access_token,根据后台返回值判断是否已经登录。
导航钩子传送门
注意router.beforeEach确保要调用next方法,否则钩子就不会被 resolved,但after钩子没有 next方法,不能改变导航
beforeEnter: (to, from, next) => {
let pattern = /^(\/p)/g
let token = sessionStorage.getItem('accessToken') //保存token
if (pattern.test(to.path)) {
Axios.post('http://localhost:3000/isLogin', {access_token: token})
.then(res => {
if (res.data.code === 0) {
console.log(from)
console.log(to)
next()
} else {
router.push({name: 'Login'})
next()
}
})
.catch(err => {
console.log(err)
})
}
}
后端处理token是否合法
后台获取到传递的token值,利用jwt.decode(token, jwtTokenSecret)对其解码,解码结果就是当初我们加密的对象{iss, exp},首先根据exp判断token是否过期,然后根据_id查询数据库是否有这个用户
// 登录验证
exports.authority = function (req, cb) {
// JWT 允许客户端使用一下3个方法附加token:
// 作为请求链接(query)的参数,作为主体的参数(body),
// 和作为请求头(Header)的参数。
var token = (req.body && req.body.access_token) || (req.query && req.query.access_token) || req.headers['access-token']
if (token) {
try {
var decoded = jwt.decode(token, jwtTokenSecret) // 解码
if (decoded.exp <= Date.now()) { // 判断token是否过期
entries.code = 99
cb(false, entries)
} else { // 之前加密对象是 user._id
User.findOne({ _id: decoded.iss }, function(err, user) {
if (err) {
console.log(err)
} else if (user !== null) {
entries.code = 0
cb(true, entries)
}
})
}
} catch (err) {
console.log(err)
}
} else {
entries.code = 99
cb(false, entries)
}
}
源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue登录注册
# Vue登录
# vue实现未登录跳转到登录页面的方法
# vue 微信授权登录解决方案
# Vue 实现登录界面验证码功能
# vue实现登录页面的验证码以及验证过程解析(面向新手)
# 详解Vue微信授权登录前后端分离较为优雅的解决方案
# Vue退出登录时清空缓存的实现
# Vue.js实现一个SPA登录页面的过程【推荐】
# Vue实现液态玻璃登录卡片的效果示例
# 后端
# 请输入
# 放在
# 就能
# 文档
# 输入密码
# 都是
# 是否合法
# 在这里
# 完成后
# 让我们
# 还能
# 下划线
# 两次
# 将其
# 能在
# 对其
# 才发现
# 花了
# 想了
相关文章:
如何正确选择百度移动适配建站域名?
建站之星伪静态规则如何正确配置?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何通过多用户协作模板快速搭建高效企业网站?
建站之星2.7模板快速切换与批量管理功能操作指南
定制建站流程步骤详解:一站式方案设计与开发指南
建站之星免费模板:自助建站系统与智能响应式一键生成
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何高效配置IIS服务器搭建网站?
建站之星后台管理如何实现高效配置?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
建站之星图片链接生成指南:自助建站与智能设计教程
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何有效防御Web建站篡改攻击?
如何通过服务器快速搭建网站?完整步骤解析
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何快速搭建自助建站会员专属系统?
如何选择美橙互联多站合一建站方案?
如何使用Golang安装API文档生成工具_快速生成接口文档
在线制作视频网站免费,都有哪些好的动漫网站?
如何高效利用亚马逊云主机搭建企业网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何快速建站并高效导出源代码?
Android使用GridView实现日历的简单功能
如何通过老薛主机一键快速建站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何在Tomcat中配置并部署网站项目?
c# 服务器GC和工作站GC的区别和设置
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何快速搭建高效简练网站?
如何构建满足综合性能需求的优质建站方案?
利用JavaScript实现拖拽改变元素大小
Swift中循环语句中的转移语句 break 和 continue
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何选择适合PHP云建站的开源框架?
浅谈Javascript中的Label语句
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何在阿里云通过域名搭建网站?
如何在腾讯云免费申请建站?
建站之星云端配置指南:模板选择与SEO优化一键生成
浅析上传头像示例及其注意事项
表情包在线制作网站免费,表情包怎么弄?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速搭建虚拟主机网站?新手必看指南
如何通过NAT技术实现内网高效建站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
油猴 教程,油猴搜脚本为什么会网页无法显示?
*请认真填写需求信息,我们会在24小时内与您取得联系。