首页 > 技术文章 > 09 . Vue登录,注册组件及主页布局,用户管理,数据统计功能

you-men 2020-08-24 23:49 原文

开发模式

前后端分离
前端技术栈
/*
		Vue
		Vue-Router
		Element-UI
		Axios
		Echarts
*/
后端项目技术栈
/*
		Node.js
		Express
		Jwt
		Mysql
		Sequelize
*/

项目初始化

初始化步骤
/*
		1.安装Vue脚手架
		2.通过Vue脚手架创建项目
		3.配置Vue路由
		4.配置Element-UI组件库
		5.配置axios库
		6.初始化git远程仓库
		7.将本地项目托管到Github或码云中
*/	

创建项目请看我写的前面Vue脚手架创建使用

https://www.cnblogs.com/you-men/p/14015406.html

后台项目环境安装配置
mysql

create database mydb charset=utf8;
use mydb
source /root/mydb.sql
测试后台接口是否正常

登录概述

登录业务流程
/*
		1. 在登录页输入用户名和密码
		2. 调用后台接口进行验证
		3. 通过验证之后,根据后台的响应状态跳转到项目主页
*/
登录业务技术点
/*
		1. http是无状态的
		2. 通过cookie在客户端记录状态
		3. 通过session在服务器端记录状态
		4. 通过token方式维持状态
*/
token原理分析

token登录实现

登录页面布局

通过Element-UI组件实现布局

/*
		el-form
		el-form-item
		el-input
		el-button
		字体图标
*/

每当我们开发一个新功能最好开一个新分支,开发完毕没问题再合并到Master分支

/*
		git checkout -b
		git checkout -b login  创建login分支
		git branch  查看当前所有分支
*/
路由导航守卫控制访问权限

如果用户没有登录,但是直接通过URL访问特定页面,需要重新导航到登录页面

// 为路由对象,添加beforeEach 导航守卫
router.beforeEach((to,from,next) => {
  	// 如果用户访问的登录页,直接放行
  if (to.path == '/login') return next()
  // 从sessionStorage中获取保存的token值
  const tokenStr = window.sessionStorage.getItem('token')
  if(!tokenStr) return next('/login')
	next()
})
退出功能

基于token的方式实现退出比较简单,只需要销毁本地的token即可,这样后续的请求就不会携带token, 必须重新登录生成一个新的token之后才可以访问页面

// 清空token
window.sessionStorage.clear()

// 跳转到登录页
this.$router.push('/login')

提交登录功能

git提交
git add .
git commit -m "add login Features"
git branch 
* login
  master
git branch
  login
* master
git merge login
git push

主页布局

通过接口获取菜单数据

通过axios请求拦截器添加token,保证有获取数据的权限

// axios请求拦截
axios.inteerceptors.request.use(config => {
  // 为请求头对象,添加Token验证的Authorization字段
  config.headers.Authorization = window.sessionStorage.getItem('token')
  return config
})

提交用户代码

git checkout -b user
git branch
  login
  master
* user
git add .
git commit -m "完成用户列表功能的开发"
git push -u origin user
git checkout master
git merge user
git push

权限功能开发

创建新分支
git checkout -b rights
git push -u origin rights
权限管理业务分析

通过权限管理模块控制不同的用户可以进行哪些操作,具体可以通过角色的方式进行控制, 即每个用户分配一个特定的角色,角色包括不通的功能权限.

获取渲染权限列表
获取渲染角色列表
提交权限功能代码
git add .
git commit -m "完成权限功能开发"
git push
git checkout master

git merge rights
git push

分类管理

数据统计功能

创建新分支
git checkout -b report
git push -u origin report
配置路由报表组件
数据报表功能
简单使用echarts
<template>
	<div>
		<!-- 面包屑导航区域 -->
		<el-breadcrumb separator-class="el-icon-arrow-right">
			<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
			<el-breadcrumb-item>数据统计</el-breadcrumb-item>
			<el-breadcrumb-item>数据报表</el-breadcrumb-item>
		</el-breadcrumb>

		<!-- 卡片视图区域 -->
		<el-card>
			<!-- 2.为Echarts准备一个具备大小(宽高)的Dom -->
			<div id="main" style="width: 600px;height:400px;"></div>
		</el-card>
	</div>
</template>

<script>
	// 1. 导入echarts
	import echarts from 'echarts'
	export default {
		
		mounted() {
			// 3.只有执行到mounted,页面上的元素渲染完毕,可以初始化图表了
			var myChart = echarts.init(document.getElementById('main'))
			
			// 4. 准备数据和配置项
			var option = {
				title: {
					text: 'ECharts 入门示例'
				},
				tooltip: {},
				legend: {
					data: ['销量']
				},
				xAxis: {
					data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
				},
				yAxis: {},
				series: [{
					name: '销量',
					type: 'bar',
					data: [5, 20, 36, 10, 10, 20]
				}]
			}
			
			// 5. 展示数据
			myChart.setOption(option)
		},

		methods: {}
	}
</script>

<style lang="less" scoped>

</style>
基于时间统计的折线图
<template>
	<div>
		<!-- 面包屑导航区域 -->
		<el-breadcrumb separator-class="el-icon-arrow-right">
			<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
			<el-breadcrumb-item>数据统计</el-breadcrumb-item>
			<el-breadcrumb-item>数据报表</el-breadcrumb-item>
		</el-breadcrumb>

		<!-- 卡片视图区域 -->
		<el-card>
			<!-- 2.为Echarts准备一个具备大小(宽高)的Dom -->
			<div id="main" style="width: 750px;height:400px;"></div>
		</el-card>
	</div>
</template>

<script>
	// 1. 导入echarts
	import echarts from 'echarts'
	import _ from 'lodash'
	export default {
		data() {
			return {
				// 需要合并的数据
				options: {
					title: {
						text: '用户来源'
					},
					tooltip: {
						trigger: 'axis',
						axisPointer: {
							type: 'cross',
							label: {
								backgroundColor: '#E9EEF3'
							}
						}
					},
					grid: {
						left: '3%',
						right: '4%',
						bottom: '3%',
						containLabel: true
					},
					xAxis: [{
						boundaryGap: false
					}],
					yAxis: [{
						type: 'value'
					}]
				}
			}
		},
		async mounted() {
			// 3.只有执行到mounted,页面上的元素渲染完毕,可以初始化图表了
			var myChart = echarts.init(document.getElementById('main'))

			const {
				data: res
			} = await this.$http.get('reports/type/1')
			if (res.meta.status !== 200) {
				return this.$message.error('获取折线图数据失败!')
			}

			// 4. 准备数据和配置项
			const result = _.merge(res.data,this.options)

			// 5. 展示数据
			myChart.setOption(result)
		},

		methods: {}
	}
</script>

<style lang="less" scoped>

</style>

添加进度条
/*
  npm install --save nprogress
*/

基于拦截器实现进度条

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'


axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'

// 在request拦截器中展示进度条 NProgress.start()
axios.interceptors.request.use(config => {
	// 为请求头对象,添加Token验证的Authorization字段
	// 在最后必须return config
	// console.log(config)
	NProgress.start()
	config.headers.Authorization = window.sessionStorage.getItem('token')
	return config
})

// 在response 拦截器中隐藏进度条  NProgress.donne()
axios.interceptors.response.use(config =>{
	NProgress.done()
	return config
})

推荐阅读