项目初始化
项目介绍
总结:项目主要用于人力资源相关流程的信息管理(类似于OA)
员工管理;角色管理;权限管理;授权流程分析;组织架构......
测试项目初始化
需求:熟悉Element-UI组件库的基本使用(类似于Vant)
- 安装依赖包
npm i element-ui
- 导入插件和样式(所有的组件全部导入)
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
- 组件中可以使用任意Element-UI提供的组件了
<el-button type="primary">成功按钮</el-button>
- 表格组件的基本使用:
- 需要向el-table中注入数据
- 列和数据的关系由el-table-column组件的prop值决定
vue-element-admin介绍
目标
: 熟悉通用的 vue后台集成方案**vue-element-admin
**基本用法vue-element-admin 是一个后台管理系统前端项目解决方案,它基于 vue 和 element-ui实现。
它使用了最新的前端技术栈,内置国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,可以帮助你快速搭建企业级中后台产品原型。
集成方案:vue-element-admin
基础模板:vue-admin-template
- 集成方案预览
# 拉取代码
git clone https://github.com/PanJiaChen/vue-element-admin.git
# 切换到具体目录下
cd vue-element-admin
# 用 npm i 下载依赖包
npm i
# 启动开发调试模式 查看package.json文件的scripts可知晓启动命令
npm run dev
集成方案并不适合我们直接拿来进行二次开发,基础模板则是一个更好的选择。
基础模板, 包含了基本的 登录 / 鉴权 / 主页布局 功能模板, 我们可以直接在该模板上进行功能的扩展和项目的二次开发。
总结:vue-element-admin是一个基于Vue和Element-UI封装的一个后台管理系统的可以快速创建项目基本原型的包,集成方案提供可非常丰富的业务功能模块;基础版本提供最基础的项目架构,方便进行
正式初始化项目
目标
: 熟悉搭建一个vue中台项目的基本流程
- 拉取基础模板代码(地址之后的名称可以修改默认克隆的项目名称)
git clone https://github.com/PanJiaChen/vue-admin-template.git myhr128
- 安装项目依赖包
cd vue-admin-template
npm i
- 启动项目
npm run dev
基于git管理项目
- git init 初始化仓库
- git add 添加所有代码到暂存区
- git commit 提交初始版本
- git remote add origin gitee.com/wzj1031/myh… 添加远程仓库别名
- git push -u origin master 推送到远程
项目目录结构分析
目标
: 熟悉基础模板的项目目录结构
├── build # 构建打包相关
├── mock # 项目mock 模拟数据
├── public # 静态资源
│ │── favicon.ico # favicon图标
│ └── index.html # html模板
├── src # 源代码
│ ├── api # 所有请求
│ ├── assets # 主题 字体等静态资源
│ ├── components # 全局公用组件
│ ├── icons # 项目所有 svg icons
│ ├── layout # 全局 layout
│ ├── router # 路由
│ ├── store # 全局 store管理
│ ├── styles # 全局样式
│ ├── utils # 全局公用方法
│ ├── vendor # 公用vendor
│ ├── views # views 所有页面
│ ├── App.vue # 入口页面
│ ├── main.js # 入口文件 加载组件 初始化等
│ └── permission.js # 权限管理
│ └── settings.js # 配置文件
├── tests # 测试
├── .env.xxx # 环境变量配置
├── .eslintrc.js # eslint 配置项
├── .babelrc # babel-loader 配置
├── .travis.yml # 自动化CI配置
├── vue.config.js # vue-cli 配置
├── postcss.config.js # postcss 配置
└── package.json # package.json
此时,你可能会眼花缭乱, 因为生成的目录里面有太多的文件 我们在做项目时 其中最关注的就是**
src
**目录, 里面是所有的源代码和资源, 至于其他目录, 都是对项目的环境和工具的配置。
项目主要代码分析
目标
: 熟悉当前模板的基本运行机制和基础架构
├── src # 源代码
│ ├── api # 所有请求
│ ├── assets # 主题 字体等静态资源
│ ├── components # 全局公用组件
│ ├── icons # 项目所有 svg icons
│ ├── layout # 全局 layout
│ ├── router # 路由
│ ├── store # 全局 store管理
│ ├── styles # 全局样式
│ ├── utils # 全局公用方法
│ ├── vendor # 公用vendor
│ ├── views # views 所有页面
│ ├── App.vue # 入口页面
│ ├── main.js # 入口文件 加载组件 初始化等
│ └── permission.js # 权限管理
│ └── settings.js # 配置文件
main.js
项目入口文件主要实现如下功能
总结:
- 导入相关的资源(样式)
- 导入并配置ElementUI
- 导入图标
- 导入权限控制模块
- 导入路由
- 导入store
- 配置跟组件
App.vue
项目根组件主要提供如下功能
总结
- 左侧菜单
- 右侧内容区(顶部导航;下面内容区)
- 左侧菜单又进行了子组件拆分(拆的很稀碎)
注意:关于直接导入导出的写法要理解
// 分别导入三个组件,然后分别起一个别名,然后直接导出
export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar'
export { default as AppMain } from './AppMain'
// ES6模块化导入成员可以起一个别名
// import { default as AppMain } from './AppMain'
// import { default as Navbar } from './Navbar'
// import { default as Sidebar } from './Sidebar'
// export {
// AppMain,
// Navbar,
// Sidebar
// }
// ES6模块化导入本来就支持起一个别名
// import { info as info1 } from 'a.js'
// import { info as info2 } from 'b.js'
总结:
- 模块化导入的解构赋值支持起一个别名
- 导入之后可以直接导出 export {成员名称} from ‘路径’
permission.js
permission.js
是控制页面登录权限(路由访问)的文件, 我们可以先将此处的代码进行注释或删除,现在还没做登录拦截,等我们构建权限功能时,再从0到1进行构建。
- 将代码进行注释
settings.js
**
settings.js
**则是对于一些项目信息的配置,里面有三个属性
title
(项目名称),
fixedHeader
(固定头部)
sidebarLogo
(显示左侧菜单logo)**
settings.js
**中的文件在其他的位置会引用到,所以这里暂时不去对该文件进行变动注意:一般全局设置信息(后续有可能需要手动修改)
Vuex结构
当前的Vuex结构采用了模块形式进行管理共享状态,其架构如下
- 其中app.js模块和settings.js模块,功能已经完备,不需要再进行修改。 user.js模块是我们后期需要重点开发的内容,所以这里我们将user.js里面的内容删除,并且导出一个默认配置
export default {
namespaced: true,
state: {},
mutations: {},
actions: {}
}
- 全局模块进行拆分
// 全局模块
// import getters from '@/store/getters.js'
const getters = {
sidebar: state => state.app.sidebar,
device: state => state.app.device,
token: state => state.user.token,
avatar: state => state.user.avatar,
name: state => state.user.name
}
export default {
getters: getters,
state: {},
mutations: {},
actions: {}
}
总结:
- 默认生成3个局部模块:app.js/settings.js/user.js
- vuex也支持全局模块(拆分独立的全局模块global.js)
- getters可以直接放到全局模块即可
scss
该项目还使用了scss作为css的扩展语言,在**
styles
**目录下,我们可以发现scss的相关文件
- less
- sass/scss
- stylus
样式导入:入口文件index.scss;间接导入其他样式
index 入口文件
element-ui 覆盖element-ui的默认样式
mixin 提前定义的样式,可以再其他地方多次使用
sidebar 表示左侧菜单样式
transition 表会动画相关样式
variables 表示通用的变量
- 与less的区别
- 定义变量(less使用@;sass使用$)
- :export 表示导出样式变量用于给js环境使用
icons
图标的文件结构如下
总结:如何使用svg图标?
- 把图标svg文件复制到icons/svg目录中
- 使用svg-icon全局组件配置图标
<svg-icon class-name='abc' icon-class='user'></svg-icon>
iconClass的值是svg文件的名称
className可以定制图标的样式
- 使用svg图标的位置
@/src/layout/components/SideBar/Item.vue
render(createElement, context) {
// render函数的参数二可以获取父组件传递过来的属性值
const { icon, title } = context.props
// vnodes数组中放的是什么?字体图标的标签,或者svg组件标签
// vnodes = [<i></i>, <svg-icon></svg-icon>]
// vnodes中本质上放的是组件的实例对象
// vnodes = [{}, {props,data,watch,computed}]
const vnodes = []
if (icon) {
if (icon.includes('el-icon')) {
vnodes.push(<i class={[icon, 'sub-el-icon']} />)
} else {
vnodes.push(<svg-icon icon-class={icon}/>)
}
}
if (title) {
vnodes.push(<span slot='title'>{(title)}</span>)
}
return vnodes
}
总结:字体图标的用法;render函数的作用
注意:
- 数组中直接放入标签(HTML或者组件标签)形式的代码其实就是JSX。
- render函数参数二可以获取父组件传递过来的属性值。
Vue中实现组件的模板方式
Vue组件的模板由如下三种写法
- template
- el
- render
Vue.component('my-com', {
template: '<div>hello</div>',
data () {
return {
msg: ''
}
}
})
// --------------------------
new Vue({
el: '#app',
data: {
msg: ''
}
})
// --------------------------
// <my-com>hello</my-com>
// 本质上template里面的字符串模板运行时也会编译为render函数
Vue.component('my-com', {
data () {
return {
msg: 'nihao'
}
},
// 脚手架的开发环境不支持字符串模板,但是本质上,template在运行阶段,会自动编译成render函数
// render函数比template更加底层
// template: '<div>{{msg}}</div>'
// ---------------------------------------------
// 组件的模板可以由render函数提供
render (createElement) {
// createElement的参数
// 参数一,表示标签名称
// 参数二,表示里面的内容子元素
return createElement('div', 'hello')
}
})
总结:组件的模板由几种写法?
- el 只能用在 new Vue实例场景中
- template 传统的定义组件的方式
- render 更加底层的一种模板实现
- 单文件组件中的模板(template标签)
- render函数对JSX的支持
// 测试render函数用法
Vue.component('my-com', {
data () {
return {
msg: 'nihao'
}
},
// 脚手架的开发环境不支持字符串模板,但是本质上,template在运行阶段,会自动编译成render函数
// render函数比template更加底层
// template: '<div>{{msg}}</div>'
// ---------------------------------------------
// 组件的模板可以由render函数提供
render (createElement) {
// createElement的参数
// 参数一,表示标签名称
// 参数二,表示里面的内容子元素
// return createElement('div', 'hello')
// 如下的代码就是JSX(js代码中直接写标签)
// return (
// <div>
// <div>hello</div>
// <div>nihao</div>
// <div>hi</div>
// </div>
// )
// js结合标签一块写(JSX)
// Vue 的render函数支持React的JSX语法规则
const arr = []
arr.push(<div>hello</div>)
arr.push(<div>nihao</div>)
// 在JSX中插值表达式用的单的花括号
// 组件必须有唯一的根节点
return <div>{arr}</div>
}
})
总结:
- JSX:React框架提供的语法规则(在js代码中直接写HTML标签(组件标签))
- Vue的render函数支持JSX作为返回值,这个返回值本质上是虚拟DOM节点 VNode
- 虚拟DOM节点VNode本质上就是对象,这个对象描述了真实的DOM元素。
总结
- 熟悉项目的业务场景:PC端人力资源管理系统
- 熟悉Element-UI组件库的基本使用
- 基于vue-element-admin创建项目(默认帮助我们搭建好基础的项目架构)
- 基于git管理项目
- 熟悉这种项目的目录结构
- 分析项目的核心代码
- main.js:导入样式、图标、路由、vuex、Element插件、配置根组件
- 根组件Appvue: 导入组件后直接导出的用法,ES6导入成员可以起一个别名
- Vuex结构分析:分为全局和局部模板
- Scss代码分析:变量定义;导入用法;混入用法mixin
- 字体图标svg用法:1、把svg文件放到icons/svg目录里面;使用标签组件
- icon-class 表示组件文件名称,用来区分哪个图标
- class-name用于定制图标的样式
- svg图标相关知识点:render函数用法
- 用于给组件提供模板(类似于template属性的作用:单文件组件template标签的作用, el属性的作用),所有的其他方式,在运行阶段都会殊途同归(最终都会编异成render函数)
- render函数支持JSX语法结构(在js代码中直接写标签(HTML和组件标签))
- render函数的参数二可以获取父组件的属性值
反馈
- 字体图标
- 从使用的角度:
- 1.如果是新的图标,需要放到icons/svg目录里面
- 2.使用组件标签
<svg-icon icon-class='link'></svg-icon>
显示图标
- 从使用的角度:
- render函数
- 作用:给当前组件提供模板(与template属性、el属性作用一样;单文件组件的template标签)
- 所有的模板最终在运行时都会编译为render函数
- render函数中的模板如果是基于createElement函数实现模板的话,是非常复杂的
- 支持JSX方式在render函数中实现模板效果
<template>
<div>
<div>tom</div>
<div>jerry</div>
</div>
</template>
<script>
export default {
name: 'Test'
// render (createElement, context) {
// const tom = createElement('div', 'tom')
// const jerry = createElement('div', 'jerry')
// const div = createElement('div', [tom, jerry])
// return div
// }
render (createElement, context) {
// 如下的方式,其实就是JSX的语法结构(在js代码中写HTML标签和组件标签)
// jsx中的标签可以作为函数的参数、返回值,也可以赋值给一个变量
const info = (
<div>
<div>tom</div>
<div>jerry</div>
<svg-icon icon-class='link'/>
</div>
)
return info
}
}
</script>
- sass语法: 与less的绝大多数规则一致
- 样式的写法支持嵌套
- 支持变量:less使用@定义变量;sass使用$定义变量
- 混入mixin......好多特性
- layout整体结构(项目代码的整体结构)
- 一级路由
- 404 对应的是404组件
- / 对应的是Layout组件
- /login 对应的是login组件
- 一级路由
API模块介绍
目标
介绍API模块的单独请求和 request模块的封装
- axios拦截器原理
- 创建axios实例
utils/request.js
import axios from 'axios'
// 基准路径
const baseURL = 'http://ihrm-java.itheima.net/api/'
// 创建一个axios实例对象
const instance = axios.create({
// baseURL: process.env.VUE_APP_BASE_API
baseURL: baseURL,
// 超时,如果超过5秒,后端没有返回数据,那么就报错
timeout: 5000
})
export default (options) => {
return instance({
// 请求方式
method: options.method || 'GET',
// 请求地址
url: options.url,
// post/put 请求体传递的参数
data: options.data,
// get 请求传参
params: options.params,
// 请求头
headers: options.headers
})
}
- api模块单独封装
import request from '@/utils/request'
// 登录功能
export function login (data) {
return request({})
}
// 获取用户信息
export function getInfo (token) {
return request({})
}
// 退出功能
export function logout () {
return request({})
}
总结:
- 封装通用的接口调用方法 request
- api模块用户登录相关业务方法的封装
项目公共样式处理
目标
将一些公共的图片和样式资源放入到 规定目录中
图片资源在课程资料的图片文件中,我们只需要将**
common
**文件夹拷贝放置到 **assets
**目录即可样式资源在 资源/样式目录下
修改**
variables.scss
** (我们在**variables.scss
**添加了一些基础的变量值)新增**
common.scss
** 我们提供了 一份公共的**common.scss
**样式,里面内置了一部分内容的样式,在开发期间可以帮助我们快速的实现页面样式和布局)注意在scss文件中,通过**@import** 引入其他样式文件,需要注意最后加分号,否则会报错。
- 将两个文件放置到styles目录下,然后在**
index.scss
**中引入该样式
@import './common.scss'; // 引入common.scss样式表 (在最下面导入)
总结:
- 添加图片资源
- 修改变量信息;
- 添加一个新的样式文件