Vue实战狗尾草博客后台管理系统第七章
源码地址:https://github.com/18291907191/gwc_manage
Vue实战狗尾草博客后台管理平台第七章
本章内容为借助模块化来阐述Vuex的进阶使用。
在复杂项目的架构中,对于数据的处理是一个非常头疼的问题。处理不当,不仅对维护增加相当的工作负担,也给开发增加巨大的压力。
在大量的实战开发过程中,狗尾草总结出来的较为友好的方式是 使用一个单独的数据管理库去管理数据。
这样不会给页面增加额外的负担。且API的调用也属于数据处理/获取的部分。因此也放在数据管理下统一管理
注:本章节内容与狗尾草博客管理平台没有任何关系,仅作为Vuex的进阶使用来分享
对模块化的简单阐述
在开始时,我们需要先对模块对有一个清晰的定义!
这里不扯AMD与CMD规范。
简单论述为:对于复杂系统的开发。制作清晰的分界。广义上讲就是将一湖的水进行"渠道化分流"。但是微观上确实有非常多的东西,且可以根据具体的项目进行具体的场景分析从而进行设计。
上面所说也可以理解为模块的理解或者使用场景。
如何实现
在平时的开发中,我们可以对什么进行模块化?
我们需要一个目标,这个目标作为系统来理解。那我们就必须知道的是,我们的系统有哪些功能与业务。必须有一个清晰的四位导图来支撑。
就平常的系统来讲。所必需的的有不同功能的业务。这些业务在是实现的过程中,又分为:view,style,js。这些又可以进行划分为:组件的抽离,样式的抽离,工具类的抽离,静态资源的抽离。再次基础上一个页面就已经可以呈现到屏幕上了。但是他还是静态的,还是由我们Mock数据所支撑。并无鲜活数据的支撑。此时。我们就可以对数据进行抽离。
为什么要做模块化抽离?或者说这样做有什么好处呢?
简单说模块化意义就在于数据的可视化,便捷的管理,数据的挖掘,系统的维护,系统更为清晰的架构。当然其真实的意义与优势只有在具体的开发并实践后才有所呈现。且会根据不同系统呈现不同结果。你永远不会知道这么做会给你带来什么Surprise!
补充:让开发者对系统有更好的可控性,或许这也是模块化的意义之一。
API抽离
请求接口抽离,作为单独模块进行统一的管理,对于后端接口的服务,在前端也会有更好的结构认识。同时在使用时也会更加便捷。
eg:

commons下可以放置我们共用的一些api模块
modules则可以对api再次进行模块化划分。
比如后端的接口服务有a服务,b服务,c服务。name我们也就可以按照a服务,b服务,c服务进行划分。
但是这里狗尾草不建议这样来配置。因为后端所用服务并不定是我们需要的。其命名也经常是一些生僻的单词,尝尝会令新加入的developer感到无力。
这里狗尾草提出的一个合理化的解决方案便是根据前端的项目的业务来划分或者前端的服务来划分。比如说用户服务(登录,注册,修改,忘记密码,权限,个人信息等),文章服务(标题,内容,更改,删除,草稿等等)。
当然这里提出的合理化的解决方案不仅如此,我们也需要在项目的README.md的文件中对api模块的划分做出合理的解释。这样对于新加入项目的同事也不会有太大的困惑。
base.js的话我们则可以进行域名的配置。根据项目不同的环境进行动态的配置。开发环境的域名,测试环境的域名。预发布环境的域名,生产环境的域名等等。这里又可以通过不同的启动命令来动态配置。(这里的配置因为每个脚手架所创建项目各有所异。因此暂不做详情说明)
api的配置结束,我们就需要一个出口文件,供其他模块进行调用。index.js则是一个很好的出口。
import serverA from './modules/serverA';
import serverB from './modules/serverB';
export default {
serverA,
serverB
}
这样一个api模块,我们就简单的抽离了出来。剩下的至于在项目中怎么使用,我们就不需要过多操心。但是好的方式的挂在global下,供全局的更为便捷的使用。
例如在Vue中,我们便可以通过install到Vue.prototype上来实现
import api from '@/api';
const install = (Vue,opts = {}) {
if (install.installed) return;
Vue.prototype.$api = api;
}
export default install;
main.js
import Utils from './utils';
Vue.use(Utils);
this.$api.模块.具体的api接口 用此方式便可更为方便的对api进行使用。当然有一个缺点是过多的东西挂载在原型链上。Vue的性能则会受到影响,但是相较于系统中频繁操作的api来言。却可以省略了。
当然API的抽离也仅仅是繁多模块化开发中的一个。
Pages抽离
Pages抽离其实并无特殊的意义,理解成本意就好。页面的抽离
这里的页面的抽离,我们则不能通过功能来进行拆分了,我们需要根据业务来走啦。
给大家一个最直观的理解:大家可以看看管理系统的菜单栏部分。一级菜单,二级菜单等等。大家的业务的流程便可以根据这些来走。
每个一级菜单作为一个大的pages来抽离
页面的设计架构我们便可以如此进行:
pages
pages1
components
data
router.js
static
pages2
components
data
router.js
static
简单阐述就是多个大型的业务模块。具体拆分为多个页面模块,此多个页面模块的路由在此业务下统一管理,常量资源,业务的Private Component,数据的管理也都在此模块下做统一处理。
其意义直观上来看,多个业务之间并无任何的耦合。并不会造成业务逻辑样式等得污染。
Router抽离
创建主路由并创建拦截,以拦截做出路由的主出口。
在此基础上对各个业务模块进行单独的路由拆分,以达到模块抽离的各个方面,并将模块使用到其他项目中,也依然可以使用。
eg:
Router/index.js主路由
import Vue from 'vue';
import Router from 'vue-router';
import { Route as RouterA } from '@/pages/xxx';
import { Route as RouterB } from '@/pages/xxx';
Vue.use(Router);
export const constantRouterMap = [
路由的配置
...RouterA,
...RouterB,
]
模块化中的路由拆分,我们则可以认为模块化中的路由为此模块的入口
eg: 某模块的入口
Modeal/index.js
export const Route = [
{
xxx:xxx路由配置
}
]
入口已配置,剩下的就在上述的代码中操作加入总的路由中,在后续路由的更改时,只需要在相应的模块中修改即可。减少了很大程度上的耦合。
基本的模块的开发就如上述那样,循规蹈矩,却又加入项目场景,经过深思熟虑做出合理魔窟阿化!
下来也就是本章的另一个重点。Vuex的进阶使用。
数据的统一管理之Vuex的进阶使用
基础的东西不多做解释,大佬们都懂得。Vuex为Vue提供了很好的数据管理方式。
Vuex is a state management pattern + library for Vue.js applications.
在使用之前,我们必须先思考,我们用它可以干什么?
简单举例来说明:
如果没有这样的一个数据的管理库,那么我们在开发时,不可避免的要经历这样的过程。n多页面之间共享数据,或组件间数据的传递。a传b,b传c,c传d,甚至会更加复杂。
从数据管理的第三方库出来后,我们便不需要这种的方式进行数据的传输。
Vue中的Vuex,React中的Redux。
Vuex的简单的流程

State: 数据的存储
Getters:state中数据的过滤,更便捷的获取
Mutations: state中数据的操作
Actions:异步请求的操作,可以理解为数据的init
modules:状态库的模块化管理
使用的流程串起来简单说就是 view 读取state数据并进行render。交互操作时,通过mutations对state数据进行更新。页面初始化派发action请求获取初始化数据。
多个页面之间需要共享数据时,只需要从store中取值就好。
当项目复杂程度较小时,我们可以在根目录下通过store/modules的结构来拆分状态库,通过index.js来提供主出口即可。
前几篇文章中使用到的store的使用就是如此。
但是当项目复杂度提升时,我们就必须设计插拔式管理。
import Vue from 'vue';
import Vuex from 'vuex';
import storeA from '@pages/xxx/store';
Vue.use(Vuex);
export default new Vuex.Store({
xxx,
xxx,
xxx,
xxx,
modules: {
...storeA
}
})
将store的管理也进行拆分管理。对组件化,模块化更深层次的配置。使各个模块在互相不依赖的情况下,也依旧不影响使用。低耦合,高复用!
如果需要对store做一个总结的话,那就是每个Pages模块拥有自己的状态管理库,自己的常量配置,自己的私有组件,在任何情况下,每个模块都能独立运行。无疑是对高复用,低耦合的很好的实现.
具体使用场景如下:
eg:
import { mapGetters,mapActions, mapMutations } from 'vuex';
computed: {
...mapGetters('模块名',['state1','state2'])
},// state的映射,在不同模块中,取出不同的模块下的数据
...mapActions('模块名',['request1','request2']),//映射出相关模块下对应的异步请求,并在需要的时候派发出去。
...mapMutations('模块名',['stateopt1','stateopt2']);//对state的操作也可以在页面中进行。但是一般不建议在页面中对state进行操作。
Vue实战狗尾草博客后台管理系统第七章的更多相关文章
- Vue实战狗尾草博客后台管理系统第三章
Vue实现狗尾草博客后台管理系统第三章 本章节,咱们开发管理系统侧边栏及面包屑功能. 先上一张效果图 样式呢,作者前端初审,关于设计上毫无美感可言,大家可根据自己情况设计更好看的哦~ 侧边栏 这里我们 ...
- Vue实战狗尾草博客管理平台第六章
Vue实现狗尾草博客后台管理系统第六章 本章节内容 文章列表 文章详情 草稿箱 文章发布. 本章节内容呢,开发的很是随意哈,因为多数就是element-ui的使用,熟悉的童鞋,是可以很快完成本章节的内 ...
- Vue实战狗尾草博客管理平台第四章
本章主要内容如下: 填补上期的坑. iconfont仓库的关联,引入. 开发登录页面 填坑 上期中我们功能都已正常使用.但不知道有没有小伙伴测试过error页面,当访问地址不存在时,路由是否能正常挑战 ...
- Vue实战狗尾草博客管理平台第五章
本章主要内容如下: 静态资源服务器的配置.学会如何使用静态资源服务器引入静态资源.并给大家推荐一个免费可使用的oss服务器~ 页面的开发由于近期做出的更改较大.就放在下一篇中. 静态资源服务器 静态资 ...
- Vue实战狗尾草博客管理系统第一章
Vue实战狗尾草博客后台管理系统第一章 这里准备采用的技术栈为:vue全家桶+element-ui 这里因为是后台管理系统,没有做SSR的必要.所以这里就采用前后端分离来昨晚这个项目~ 项目搭建 vu ...
- Vue实战狗尾草博客管理系统第二章
伙伴们出来啦,探讨各问题,关于项目中大量的表单,大家是怎么处理的? 本章主要内容如下:底层布局,路由配置,github仓库推送关联. 关联GitHub仓库 关联建立在github已创建账号的基础上 登 ...
- 使用react全家桶制作博客后台管理系统
前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基于react全家桶(React.React-r ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- 基于Laravel开发博客应用系列 —— 构建博客后台管理系统
一个完整的博客应用不能没有后台管理系统.所以在本节中我们将继续完善博客应用 —— 开发后台管理系统. 1.创建路由 在上一节十分钟创建博客项目中,已经设置过了 app/Http/routes.php, ...
随机推荐
- PostgreSQL 常用函数
类似Oracle ,PostgreSQL也有强大的类型转换函数, 下面仅举两个类型转换例子. --1 例子 postgres; ?column? ---------- ( row) 在PG里如果想做除 ...
- 如何实现Web页面录屏?
摘要: 很有意思的操作... 原文:web页面录屏实现 译者:frontdog Fundebug经授权转载,版权归原作者所有. 写在前面的话 在看到评论后,突然意识到自己没有提前说明,本文可以说是一篇 ...
- 通过Shell脚本来创建批量服务器上的MySQL数据库账号
1.项目背景 因监控需要,我们需要在既有的每个MySQL实例上创建一个账号.公司有数百台 MySQL 实例,如果手动登入来创建账号很麻烦,也不现实.所以,我们写了一个简单的shell脚本,用来创建批量 ...
- Python安装常见问题(1):zipimport.ZipImportError: can't decompress data(此问题不解决pip安装不成功)
在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...
- Putty 连接centOS7 超时问题
方法1: #vim /etc/ssh/sshd_config(添加或修改以下配置) ClientAliveInterval 60(每隔60秒给SSH客户端发送一次信号) ClientAliveCo ...
- JavaScript-----6.流程控制:分支
1.流程控制 就是来控制代码按照何种顺序来执行,流程控制有三种结构:顺序结构.分支结构.循环结构 2.顺序流程控制 程序按照代码先后顺序依次执行 3.分支流程控制 JS中提供两种分支结构语句:if语句 ...
- a迭代中的燃尽图统计
简单分析:项目一直在跟进,进展较缓,临近迭代结束,项目进度突飞猛进.
- CF1278B-A and B-(简单数学)
https://vjudge.net/problem/CodeForces-1278B 题意:给两个数a和b,有一种操作:第i次操作任选其中一个数加或减i:如第1次操作可以任选其中一个数加1或减1,第 ...
- ASP.NET Core 获取主机名时的 "Decoded string is not a valid IDN name" 错误
在 ASP.NET Core 中通过 Request.Host.Host 获取主机名(hostname)时,如果主机名中包含非 ASCII 字符(比如 puny code),就会引发下面的异常: Sy ...
- electron内监控目标网站cookie的变化,查找指定的cookie
let cookieInstance = win.webContents.session.cookies; cookieInstance.on('changed', (e, cookie, cause ...