d2-admin中那些不错的技巧
d2-admin基于vue-cli3
路由相关
刷新路由,参照官方 组件内的守卫 但是搞不明白为何加了句 render:h => h()
{
path: 'refresh',
name: 'refresh',
hidden: true,
component: {
beforeRouteEnter (to, from, next) {
next(vm => vm.$router.replace(from.fullPath))
},
render: h => h()
}
}
嵌套路由可以是一个立即执行函数
children: (pre => [
{ path: 'page1', name: `${pre}page1`, component: () => import ('@/pages/demo/page1'), meta: {...meta, title: '页面 1' } },
{ path: 'page2', name: `${pre}page2`, component: () => import ('@/pages/demo/page2'), meta: {...meta, title: '页面 2' } },
{ path: 'page3', name: `${pre}page3`, component: () => import ('@/pages/demo/page3'), meta: {...meta, title: '页面 3' } },
{ path: 'page4', name: `${pre}page4`, component: () => import ('@/pages/demo/page4'), meta: {...meta, title: '页面 444444' } }
])('demo-')
MOCK数据
安装mock数据:
在vue.config.js中,根据自定义的环境变量,来判断是否安装,默认.env文件,没有这个环境变量,则开发时,会加入模拟数据
module.exports = {
chainWebpack: config => {
const entry = config.entry('app')
if (process.env.VUE_APP_BUILD_MODE !== 'nomock') {
entry
.add('@/mock')
.end()
}
}
}
关于config.entry请查看 使用 Webpack-chain 链式生成 webpack 配法
新建一个扩展环境变量文件:.env.nomock
# 指定构建模式
NODE_ENV=production # 标记当前是 No Mock 构建
VUE_APP_BUILD_MODE=nomock
新建一个npm script,"build:nomock": "vue-cli-service build --mode nomock"
则运行这个命令来打包的时候,不会加入mock数据
mock安装结构
根据上面vue.config.js中的设置,在根目录建立mock目录
主目录index.js:
import d2Mock from './d2-mock' const req = context => context.keys().map(context)
const options = req(require.context('./api/', true, /\.js$/))
.filter(e => e.default)
.map(e => e.default) options.forEach(option => {
d2Mock.load(option)
})
使用webpack 的require.context 引入api目录中的mock数据文件, 并且得到所有默认的导出,返回新的数组
然后使用封闭好d2Mock工具来加载并安装mock数据
api目录中的文件
这里面为每个独立的url拦截,文件名可独立命名,代码示例:
export default [
{
path: '/api/getMockData',
method: 'get',
handle: {
"code":0,
"msg":"正常",
"count":300,
"data|20":[
{
"tid":"@string(abcdefghijklmnopqrstuvwxyz1234567890, 30,30 )",
"wxunionid":"@string(abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ_, 28,28 )",
"timg":"@image('200x200')",
"eimg":"@image('400x400')",
"remark":"@cparagraph()",
"pay_date":"@datetime('yyyy-MM-dd')",
"title|3":"@ctitle",
"eid|1-10":0,
"totalFee|200-500":0,
"count|1-10":0,
"tbegin":"@datetime('yyyy-MM-dd')",
"tend":"@datetime('yyyy-MM-dd')",
"tstatus|1-4": 0
}
]
} }
]
直接使用mock.js的随机数据语法,注意,这里的get或post不能使用大写,否则无效
d2-mock目录
这里是d2-admin官方扩展的mock安装处理工具,先不去研究它在写什么,能用就好
d2-mock/index.js:
import Mock from 'mockjs'
import qs from 'qs'
import withCredentials from './patch/withCredentials' /* 补丁 */
withCredentials(Mock) /* Mock 默认配置 */
Mock.setup({ timeout: '200-300' }) /* 扩展 [生成器] */
const Generator = (prop, template) => {
const obj = {}
obj[prop] = [template]
return Mock.mock(obj)
} /* 扩展 [循环] */
const Repeat = (num, itemTemplate) => Generator(`data|${num}`, itemTemplate).data const CustomExtends = {
Generator,
Repeat,
Mock,
Random: Mock.Random
} const extend = (prop, value) => {
CustomExtends[prop] = value
} /* 装配配置组 */
const wired = ({ url, type, body }) => ({
method: type,
params: qs.parse(url.split('?').length > 1 ? url.split('?')[1] : ''),
body: JSON.parse(body),
url: qs.parse(url.split('?')[0]),
...CustomExtends
})
const setup = (path, method, handle) => {
Mock.mock(
RegExp(path),
method,
typeof handle === 'function' ? o => handle(wired(o)) : handle
)
}
const load = (collection) => {
collection.map(({ path, method, handle }) => {
if (method === '*') {
method = [
'get',
'GET',
'head',
'post',
'POST',
'put',
'delete',
'connect',
'options',
'trace',
'patch'
]
}
//下面的判断应该是用于同一个api路径使用了多种方法,比如 ['post','get'] ,或 'post|get'
if (typeof method === 'string' && method.indexOf('|') > -1) method = method.split('|')
if (method instanceof Array) {
method.map(item => setup(path, item, handle))
} else {
setup(path, method, handle)
}
})
}
export default { setup, load, extend }
这个文件中导出了一个对象,里面有3个方法, 试了一下,实际在mock/index.js中,只用到了load,用来加载mock详情,setup和extend并没在外部用到。
最后执行的是setup方法,使用了mock.js的mock方法来安装,可参见官方说明
d2-mock/patch/withCredentials.js
这里一个补丁文件,用于修复mock请求时丢失cookes的问题,反正,也不知道在写什么。。
export default function (Mock) {
// http://cnine.me/note/FrontEnd/mock-lose-cookies-dbg.html
Mock.XHR.prototype.__send = Mock.XHR.prototype.send
Mock.XHR.prototype.send = function () {
if (this.custom.xhr) this.custom.xhr.withCredentials = this.withCredentials || false
this.__send.apply(this, arguments)
}
}
全局使用less\sass变量
这个属于vue-cli3的配置,官方地址
// vue.config.js
module.exports = {
css: {
loaderOptions: {
// 给 sass-loader 传递选项
sass: {
// @/ 是 src/ 的别名
// 所以这里假设你有 `src/variables.scss` 这个文件
data: `@import "@/variables.scss";`
}
}
}
}
d2-admin中那些不错的技巧的更多相关文章
- 避免Java中NullPointerException的Java技巧和最佳实践
Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的问题吧. 值得庆幸的是,通过应用 ...
- Handlebars.js循环中索引(@index)使用技巧(访问父级索引)
使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...
- Visual Studio 2015中的常用调试技巧分享
.NET 技术交流群:337901356 欢迎您的加入! 为什么要学习调试? 调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这 ...
- ACM 做题过程中的一些小技巧。
ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...
- C语言中的调试小技巧
C语言中的调试小技巧 经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的 ...
- jquery获取json对象中的key小技巧
jquery获取json对象中的key小技巧 比如有一个json var json = {"name" : "Tom", "age" : 1 ...
- ckeditor django admin 中使用
ckeditor settings配置 ############ # CKEDITOR # ############ MEDIA_ROOT = os.path.join(BASE_DIR, 'medi ...
- app在admin中显示成我们想要的中文名
在django的开发中,很多时候我们希望app在admin中显示成我们想要的中文名,而不是显示默认的app_label名称. 比如我们有一个blog应用,在我们的blog app目录下面,默认会生成一 ...
- Django之admin中管理models中的表格
Django之admin中管理models中的表格 django中使用admin管理models中的表格时,如何将表格注册到admin中呢? 具体操作就是在项目文件夹中的app文件夹中的admin中注 ...
随机推荐
- 云时代的IT运维面临将会有哪些变化
导读 每一次IT系统的转型,运维系统和业务保障都是最艰难的部分.在当前企业IT系统向云架构转型的时刻,运维系统再一次面临着新的挑战.所以在数据中心运维的时候,运维人员应该注意哪些问题? 在云计算时代, ...
- 华为5G在印度被禁
前段时间,澳大利亚政府以“担心外国渗透”为由,决定禁止华为为建设新的5G网络提供设备.这让大家不禁猜测,难道华为的5G真的被国外市场禁入了? 对此,华为表达出了极大的失落感,并在一份声明中称,“政府告 ...
- 【转】linux环境内存分配原理 malloc info
Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全 ...
- BZOJ 3864 Hero meet devil 超详细超好懂题解
题目链接 BZOJ 3864 题意简述 设字符集为ATCG,给出一个长为\(n(n \le 15)\)的字符串\(A\),问有多少长度为\(m(m \le 1000)\)的字符串\(B\)与\(A\) ...
- [hdu3966]Aragorn's Story
传送门 题目描述 Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One ...
- luogu2680 [NOIp2015]运输计划 (tarjanLca+二分答案+树上差分)
我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有 ...
- Centos6.5 防火墙开放端口
0. 说明 centos6.5处于对安全的考虑,严格控制网络进去.所以在安装mysql或者使用tomcat,需要开放端口3306或8080. 通常的解决办法有两个.一个是直接关闭防火墙(非常不推荐): ...
- LICS O(n*m)+前驱路径
LICS:最长公共上升子序列: 一般令f[i][j]表示a串前i位,b串以j结尾的LICS长度.于是,答案为:max(1~m)(f[n][i]); 朴素做法:O(n^3) 相等时,从1~j-1枚举最大 ...
- 4月1日->-4月15日 2周阶段性计划
4月1日->4月14日 ST表 树状数组 LCA 一周的时间,力求掌握这三个知识点并各刷五道题左右. 树状数组 ST表 LCA 然而:进展总比计划快(......什么鬼) 树状数组刷了5题,ST ...
- A1052. Linked List Sorting
A linked list consists of a series of structures, which are not necessarily adjacent in memory. We a ...