项目需求
后台新闻管理系统,主要功能:
- 登录和注册、首页(文章数据的统计展示)、文章管理、个人中心等
项目技术栈
- vue全家桶(vue + vue-router + vuex + vue-cli)
- element-ui(组件库)
- dayjs(时间格式化)
- echarts(图表库)
- quil-editor(富文本编辑器)
项目起步
创建项目
使用vue-cli创建
前提:安装node.js (默认安装到系统盘,不要动)
安装vue-cli npm i -g @vue/cli
使用vue-cli提供的创建项目命令vue create 项目名
目录设计
目的:工程化开发 目录
- api (后台接口方法)
- assets (静态资源)
- images(图片)
- components (全局组件)
- router(路由配置)
- store (vuex 全局数据共享)
- modular(子模块文件)
- style (全局样式)
- utils (全局公用工具方法)
-
axios 封装
开发的时候对axios进行封装,放到utils目录中
- 后台接口请求方法封装,放到api目录中 ```javascript import axios from ‘axios’
// 配置根路径 const request = axios.create({ baseURL: ‘根路径’ })
// 添加拦截器 // 请求拦截器 request.interceptors.request.use( (config) => { // 配置请求头 config.headers return config })
// 响应拦截器 request.interceptors.request.use( (response) => { return response }), (error) => { // 判断401响应错误 删除本地token 跳转登录页 return Promise.reject(error) }
<a name="seeWE"></a>
## vuex模块化
根据项目需求,模块化管理项目中用到的全局共享数据<br />`store/modulse/子模块.js`
```javascript
export default {
// 模块加锁
namespaced: true
// 定义变量
state: {},
// 修改变量
mutations: {
update(state,payload) {
state.变量名= payload
}
},
// 获取后台数据,异步
actions: {
getDate({commit},payload) {
// commit 方法可以调用外部mutations里的函数
commit('函数名',参数)
}
}
}
在父模块注册
import 子模块名 from './modules/子模块.js'
export default new Vue.Store({
//...
//注册子模块
modules: {
// 键值对一样可以省略
子模块名
}
})
项目开发
前置
element 表单使用要点
- el-form组件 =》 :model=”表单变量” :rules=”校验规则”
- el-form-item =》lable=”表单项左边的名称” prop=”校验属性名”
- el-input 组件=》 v-model=”data变量” =》双向绑定 获取用户操作后的视图数据
- el-button =》点击提交表单=》兜底校验(this.$refs.ref值.validate() )
页面访问控制
没有登录不能访问后台页面(需要token才能)使用路由的前置守卫,配置白名单(登录、注册)
router.beforeEach((to,from,next)=>{
// 排除白名单
// 根据是否有token?有放行页面 :没有跳回登录页
})
token过期处理
使用响应拦截器,处理401 (状态码401是身份验证失败)
request.interceptors.response.use((res)=>{
// 2xx进入这里
return res
}, (error)=>{
// 2xx之外进入这里
// 使用场景:拦截token失效,401情况=》跳回登录页
// error.response.status === 401
})
用户信息修改
使用vuex中存储的用户数据进行修改操作:
- vuex中用户数据发请求存到vuex=》异步,造成组件data中使用异步数据获取不到
解决❓:watch监听vuex中需要使用的state变量,变化后立即同步给data变量使用
- 如果把一个复杂类型vuex的变量直接赋值给data,会互相修改
解决❓: 进行拷贝:{…state变量} 浅拷贝 | JSON.parse(JSON.stringify(state变量)) 深拷贝
watch: {
// 调用方法需要‘’内
'$store.state.user.userInfo': {
// 切页面之后数据又消失了
// 需要加上immediate 页面加载之后立即执行一次监听
immediate: true,
handler (newValue) {
// 这样newValue和vuex是有引用关系的
// this.userInfo = newValue
// 浅拷贝
// {...拷贝对象}
this.userInfo = { ...newValue }
// 深拷贝
// JSON.parse(JSON.stringify(拷贝对象))
}
}
},
头像上传
读取file对象
1.准备img元素 (预览图)、input type=”file” 选择框
2.点击按钮触发点击选择框(ref操作dom)通过change事件获取file对象
// 1. 通过FileReader,把file转成base64格式
// 实例化FileReader对象
const fr = new FileReader()
// 使用fr.readAsDataURL方法读取图片内容
fr.readAsDataURL(e.target.files[0])
// 通过fr的onload事件获取=》读取图片内容base64格式
fr.onload = (event) => {
this.src = event.target.result
}
// 2. 通过URL.URL.createObjectURL(file对象) =》图片地址
URL.URL.createObjectURL(file对象)
3.调接口 进行图片的上传操作 =》入库