2019独角兽企业重金招聘Python工程师标准>>>

当项目过大时会存在很多接口,而且不同人写不同的接口很不方便管理,这里可以定义在json文件里面定义接口,然后通过模板生成相应的文件,这样会方便管理和阅读,在根目录定义一个coder文件夹,定义一个schema.json文件,先来看看定义的接口json文件如下:

{"doc": {"models": {"sooKey": [{"title": "菜单","path": "/menu/getMenu","methods": false,"name": "getMenu","state": "getMenu","httpMethod": "post"},{"title": "哎呦不错呦12","path": "xtztc/info/key12","methods": false,"name": "getScriptPeple","state": "getScriptPeple","httpMethod": "post"}],"myTest": [{"title": "测试","path": "/menu/getTitle","methods": false,"name": "getTitle","state": "getTitle","httpMethod": "post"}]}}
}

上面定义的文件中title为描述接口的描述,path为接口路径,name定义接口的方法,httpMethod为请求的方法,每个数组相当于一个模块下的接口,这里以post为演示,在coder文件下定义一个index.js文件,创建一个templates文件夹,在templates文件夹下创建两个文件分别是:types.js和store.js如下:

先看看index.js文件

const fs = require('fs')
const path = require('path')
// 引入遍历插件
const _ = require('lodash')
// const rm = require('rimraf')// 引入接口文档
const SCHEMA = require('./schema.json')
const beautify = require('js-beautify').js_beautify
// 导入生产types模板
const typesRender = require('./templates/types')//导入生成store的模板
const storeRender = require('./templates/store')// 配置文件
const config = {// 生成store文件路径outStorePath: '../src/store/coder/',// 生成store配置文件路径outStoreType: '../src/store/',
}
// const MODELS = parseSchemas(SCHEMA.doc.models || {})
// json文件赋值
const MODELS = SCHEMA.doc.models || {};/*** 创建文件* @param path* @param fileName* @param content*/
function writeFile (path, fileName, content) {if (!fs.existsSync(path)) {fs.mkdirSync(path)}fs.writeFileSync(path + toKebabCase(fileName) + '.js', content, {encoding: 'utf8'})
}
// 大小写转换
function toUpperCase (name) {return name.toUpperCase()
}/*** Foo Bar | --foo-bar | __foo_bar__ => fooBar* @param name*/
function toCamelCase (name) {return _.camelCase(name)
}/*** Foo Bar | fooBar | --foo-bar => foo_bar* @param name*/
function toSnakeCase (name) {return _.snakeCase(name)
}/*** fooBar => foo-bar* @param name*/
function toKebabCase (name) {return _.kebabCase(name)
}function toUpperSnakeCaseName (name) {return toUpperCase(toSnakeCase(name))
}/*** 格式化js代码* @param content* @returns {*}*/
function beautifyJs (content) {content = content.replace(/(\r\n|\n)\s*/g, '\n').replace(/\(\n/g, '(').replace(/,\n/g, ',').replace(/\/\*\*/g, '\n/**').replace(/\n\/\//g, '\n\n//')return beautify(content, {indent_with_tabs: false,indent_size: 2,jslint_happy: true,end_with_newline: true,space_after_anon_function: true})
}
/*** 生成store文件*/
function writeStore () {// 定义types模板的数据let types = {}//定义modules.js的数据和modules.js导出的字段let modules = [], extendsArray = []// 遍历json文件_.each(MODELS, function (model, name) {modules.push(`import ${name} from './coder/${ toKebabCase(name)}'`)extendsArray.push(name)let importTypeArray = [],customStateArray = [],items = []types[name] = []_.each(model, function (item) {types[name].push({name: toUpperSnakeCaseName(item.name)})importTypeArray.push(toUpperSnakeCaseName(item.name))customStateArray.push(item.state)items.push({NAME: toUpperSnakeCaseName(item.name),name: toCamelCase(item.name),state: item.state,url: item.path,httpMethod: item.httpMethod,ajaxParam: 'data'})})// 定义生成文件的路径const outPath = path.join(__dirname, config.outStorePath)console.log(items, 'itemsitemsitems');// 生成store模板文件并传值writeFile(outPath, name, beautifyJs(storeRender({name: name,kebabCaseName: toKebabCase(name),importTypeArray: importTypeArray,customStateArray: customStateArray,items: items})))});// 定义生成文件的路径const outStore = path.join(__dirname, config.outStoreType)// 生成types模板文件并传值writeFile(outStore, 'types', beautifyJs(typesRender({types: types})))modules.push(`export default {${extendsArray.join(', ')}}`)// 生成modules模板文件并传值writeFile(outStore, 'modules', modules.join('\n') + '\n')
}
function init() {// 初始化// console.log(SCHEMA, 'asd');console.log('开始生成代码.....')writeStore();console.log('代码构建完成.....')
}
init()

然后是templates下的types.js文件和store.js文件

// types.js文件
const _ = require('lodash')
module.exports = _.template(`
<%_.each(types, function(items, name){%>
// <%=name%><%_.each(items, function(item){%>export const <%=item.name%> = '<%=item.name%>'<%})%>
<%})%>
`)

store.js文件

// store.js文件
const _ = require('lodash')
module.exports = _.template(`
/*! build time: <%=new Date().toLocaleString()%> */
// <%=importTypeArray.join(', ')%>
import { <%=importTypeArray.join(', ')%> } from '../types'
import axios from "axios"
// store module
export default {actions: {<%_.each(items, function(item, i){%><%if(i>0){%>,<%}%>  <%if(item.httpMethod == 'post'){%>[<%=item.NAME%>]({commit}, <%_.each(item.params, function(param){%><%=param%>,<%})%><%=item.ajaxParam%>={}) {return new Promise(function(resolve, reject){axios.post('<%=item.url%>',<%=item.ajaxParam%>).then(data=>{resolve(data)})});}<%}%><%})%>}
}
`)

然后就是运行index.js文件,在package.json文件的scripts下添加一行"coder": "node coder/index.js"如下:

然后就是运行npm run coder,运行后会在src的store下types.js和modules.js文件,以及store文件夹下的code文件夹下的几个文件,文件个数和json下的数组个数相关,文件名称以json文件里面的name属性相关,具体代码可以看index.js,代码结构如下:

相关代码如下:

//soo-key.js文件,这里用到了vuex的action和modules
/*! build time: 2019-1-8 16:20:44 */// GET_MENU, GET_SCRIPT_PEPLE
import {GET_MENU,GET_SCRIPT_PEPLE
} from '../types'
import axios from "axios"// store module
export default {actions: {[GET_MENU]({commit},data = {}) {return new Promise(function (resolve, reject) {axios.post('/menu/getMenu', data).then(data => {resolve(data)})});},[GET_SCRIPT_PEPLE]({commit},data = {}) {return new Promise(function (resolve, reject) {axios.post('xtztc/info/key12', data).then(data => {resolve(data)})});}}
}

types.js文件

types.js文件
// sooKey
export const GET_MENU = 'GET_MENU'
export const GET_SCRIPT_PEPLE = 'GET_SCRIPT_PEPLE'// myTest
export const GET_TITLE = 'GET_TITLE'
modules.js文件
import sooKey from './coder/soo-key'
import myTest from './coder/my-test'
export default {sooKey, myTest}

然后就是src下的store.js文件,也就是引入modules

import Vue from 'vue';
import Vuex from 'vuex'
// 引入modules文件
import modules from './modules'
import usually from './usually'
import getters from './getters'
Vue.use(Vuex);
export default new Vuex.Store({modules: {...modules,usually},getters: {...getters}
})

使用方法,在相应组件下引入import {GET_MENU} from "../../store/types";

this.$store.dispatch(GET_MENU, {asd:10}).then((res)=>{console.log(res, 'resresresres');this.menuList = res.data.msg;    // console.log(this.menuList, 'this.menuListthis.menuListthis.menuList');});

总结:以后不管是谁只要添加接口,只要在schema.json文件下添加相应的接口,然后直接运行npm run coder就可以自动生成相应文件,然后像上面一样调用就可以了

转载于:https://my.oschina.net/u/3012119/blog/2998862

基于vuex动态添加接口(含axios的封装)相关推荐

  1. 【数学建模】基于matlab武汉地铁2号线路线地图动态模拟【含Matlab源码 1092期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab武汉地铁2号线路线地图动态模拟[含Matlab源码 1092期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  2. 基于layui的动态添加条件查询ui插件

    layuiExtend 项目介绍 最近做一个档案系统,发现字段超多,查询页面布局不是很好弄,于是就想着干脆写一个动态添加条件的ui插件. 因为是用的layui框架写的系统,所以就直接基于layui编写 ...

  3. 【数学建模】基于matlab动态水波仿真【含Matlab源码 2056期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab动态水波仿真[含Matlab源码 2056期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  4. 【直流电机】基于matlab Simulink双闭环直流调速系统动态仿真模型【含Matlab源码 2363期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[直流电机]基于matlab Simulink双闭环直流调速系统动态仿真模型[含Matlab源码 2363期] 点击上面蓝色字体,直接付费 ...

  5. MpAndroidChart-LineChart 折线图使用(含动态添加点,动态添加曲线)

    目录 零.简介 一.MpAndroidChart的基本使用 1.依赖:project的build.gradle 中添加 2.app的build.gradle 中添加 3.举例 4.常用API 二.Mp ...

  6. axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理

    我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护. 一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios ...

  7. 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理

    一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响 ...

  8. $.post请求的参数在后台代码中得到为null_vue中Axios的封装和API接口的管理

    来源:愣锤 https://juejin.im/post/684490365288107214 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题,我们所要的说的axio ...

  9. activemenu怎么拼 vue_vue-element-admin登录逻辑,以及动态添加路由,显示侧边栏

    这段时间在研究element-admin,感觉这个库有许多值得学习的地方,我学习这个库的方法是,先看它的路由,顺着路由,摸清它的逻辑,有点像顺藤摸瓜. 这个库分的模块非常清晰,适合多人合作开发项目,但 ...

最新文章

  1. 电热水器技术性能指标
  2. selenium工具的安装
  3. IC/FPGA校招笔试题分析(三)
  4. Java File类应用:递归遍历文件夹和递归删除文件
  5. c# 第四课 interfaces
  6. Linux下MySQL 5.5.11编译安装笔记(待验证)
  7. php把excel转化为csv,php如何把excel转化为csv
  8. UI帮手|小样机大作用
  9. python如何读取csv文件列表页_Python:使用列表列表读取CSV文件的字段
  10. mybatis注册映射文件
  11. win10装kali linux双系统,win10安装kali组成双系统攻略
  12. android游戏和ios游戏哪个多,从2019年3月开始的5款最佳Android和iOS游戏
  13. 计算机保研面试题-数据结构
  14. android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态
  15. python sasl_Pyhive、SASL和Python 3.5
  16. Scipy之图片降噪
  17. Java名词解释什么是继承_java程序设计名词解释
  18. Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳
  19. php提取字符串连接,如何从PHP中的字符串中提取URL?
  20. 数字视频的发展从1080i到720p再到1080p

热门文章

  1. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G-Num 题解
  2. web开发课程,css下拉框默认选中
  3. 流程图的分类、绘制流程图的注意事项
  4. 网站的护眼模式和夜间模式
  5. ubuntu 22.04如何从gnome桌面切换到xfce4
  6. 3.样条曲线之NURBS
  7. JAVA解压压缩包后的中文乱码问题
  8. tpm2-tools源码分析之tpm2_verifysignature.c(2)
  9. elementUI table 获取已勾选的行的数据
  10. php+控制器中的全局变量,php中的全局变量引用