1.创建autoConfig.js,并填写设置数据

var addConfig = [{
    // 测试自动生成页面
    open: true, // 参与生成 false表示改配置不参与生成页面
    addFile: true, // false 不加文件夹  true 新增文件夹-----组件文件夹
    templateName: 'auto_home.vue', //使用模板的名称
    pagePath: 'businessAnalysis', //创建页面的文件夹地址
    name: 'autoTablepage', // 文件夹名称
    VueName: 'index.vue', // Vue文件名称
    routeFile: 'businessAnalysis', //路由对应文件
    routePath: 'Management', //路由对应地址
    routeName: 'RouteTest', //路由name名称
    /* 路由参数配置 */
    title: '测试路由', //mate的title内容
    icon: 'middlequan', //mate的icon内容
    auth: ['Procured.procuredOrder'], //mate的auth内容
    pageInfo: {
        // 表格数据请求相关
        title: '自动生成',
        url: '', //页面获取数据接口
        tableJson: "autoTable.json", //table的数据
    },
}]
module.exports = addConfig

2.新建build-page.js文件,引入需要的内容

var addConfig = require('./addConfig')
var fs = require('fs')
var path = require('path')
var shell = require('shelljs')

3.遍历数据,判断是否生成文件或文件夹

addConfig.forEach((config) => {
    if (config.open) {
        var paths
        if (config.addFile) {
            /* 生成文件夹 */
            paths = path.resolve(`./src/views/${config.pagePath}/${config.name}`)
        } else {
            /* 不生成文件夹 */
            paths = path.resolve(`./src/views/${config.pagePath}`)
        }
        shell.echo('页面地址:' + paths)
        shell.echo('文件状态:' + fs.existsSync(paths))
        if (fs.existsSync(paths)) {
            /* 存在相同文件 删除后新建文件夹 */
            removeDir(config, paths)
            buildPage(config, paths)
        } else {
            /* 不存在相同文件 新建文件夹 */
            buildPage(config, paths)
        }
    }
})

3.1删除相同文件

/* 删除文件夹 */
function removeDir(config, paths) {
    shell.echo(config.addFile)
    if (config.addFile) {
        /* 新增目录 */
        let files = fs.readdirSync(paths)
        for (var i = 0; i < files.length; i++) {
            let newPath = path.join(paths, files[i]);
            shell.echo('删除文件:' + newPath)
            let stat = fs.statSync(newPath)
            if (stat.isDirectory()) {
                //如果是文件夹就递归下去
                removeDir(config, newPath);
            } else {
                //删除文件
                fs.unlinkSync(newPath);
            }
        }
        fs.rmdirSync(paths) //如果文件夹是空的,就将自己删除掉
    } else {
        /* 新增文件 */
        let newPath = path.join(paths, `/${config.VueName}`);
        if (fs.existsSync(newPath)) {
            fs.unlinkSync(newPath);
        }
    }
}

4.构建vue读取生成模板auto_add.vue,定义替换设置数据

vue快速生成template vue界面生成_vue快速生成template

vue快速生成template vue界面生成_ide_02

 

 5.读取模板内容作为字符串输出,准备修改

function buildPage(config, paths) {
    shell.echo('页面地址:' + paths)
    if (config.addFile) {
        /* 新增文件夹后新增文件 */
        fs.mkdirSync(paths, (function () {
            fs.readFile(path.resolve(`./src/auto-build-page/template/${config.templateName}`), (err, data) => {
                if (!err) {
                    writePage(data.toString(), paths, config)
                }
            })
        }()))
    } else {
        /* 直接新增文件 */
        fs.readFile(path.resolve(`./src/auto-build-page/template/${config.templateName}`), (err, data) => {
            if (!err) {
                writePage(data.toString(), paths, config)
            }
        })
    }

}

 6.替换指定数据内容,修正模板字符串

/* 替换vue模板中指定内容 */
function handleStr(str, config) {
    if (config.helloworld) {
        return str
    }
    let map = config.pageInfo
    for (let k in map) {
        if (k == "tableJson") {
            var jsonList = require(`./tableJson/${map[k]}`)
            str = str.replace('%el-table-column%', handleTable(jsonList))
        } else {
            str = str.replace(`%${k}%`, map[k])
        }
    }
    r

7.新增vue并写入内容,准备添加路由

function writePage(vueStr, paths, config) {
    str = handleStr(
        vueStr,
        config
    )
    fs.writeFile(`${paths}/${config.VueName}`, str, (e) => {})
    shell.echo('开始新增路由……')
    /* 新增路由异步执行 */
    addToConf(config)
}

8.读取路由文件,对内容进行处理

function handleConfRouStr(ori, config) {
    let str = ori.split('export default')
    let routeMap = eval('(' + str[1] + ')')
    if (routeMap.children) {
        routeMap.children = recurRoute(routeMap.children, `${config.routePath}/${config.routeName}`, config)
        // shell.echo('修改的路由>>>')
        // shell.echo(routeMap.toString())
    }
    routeMap = `{${StringRoute(routeMap)}}`
    var pagePath = config.addFile ? `${config.pagePath}/${config.name}` : config.pagePath
    let url = `@/views/${pagePath}/${config.VueName}`
    shell.echo("地址 :" + url)
    routeMap = routeMap.replace('newChangeUrl', url)
    routeMap = routeMap.replace('fileName', config.routeFile)
    ori = [str[0], routeMap].join('export default')
    return ori
}

9.递归路由数据,通过设置数据进行路由配置

/* 递归处理路由 将新增内容填充至合适位置 */
function recurRoute(children, routePath, config) {
    let routeLeve = routePath.split('/').filter((v, i) => i > 0)
    /* 修改路由之后的内容不变 */
    if (routeLeve.length <= 0) {
        return children
    }
    /* 找到需要继续向下找的对应路径 */
    if (children.some(item => item.path === routeLeve[0])) {
        /* 是否存在children */
        let result = children.map(item => {
            if (item.path === routeLeve[0] && routeLeve.length === 1) {
                item.path = routeLeve[0]
                item.name = config.routeName
                item.component = () => import( /* webpackChunkName: 'fileName' */ "newChangeUrl")
                item.meta = {}
                item.meta.title = config.title
                item.meta.icon = config.icon
                item.meta.auth = config.auth
                if (config.sidebar == true || config.sidebar == false) item.meta.sidebar = config.sidebar
                return item
            } else if (item.path === routeLeve[0] && routeLeve.length > 1) {
                if (!item.children) {
                    item.children = []
                    item.children = recurRoute(item.children, routeLeve.join('/'), config)
                    return item
                } else {
                    item.children = recurRoute(item.children, routeLeve.join('/'), config)
                    return item
                }
            } else {
                return item
            }
        })
        return result
    }
    /* 找不到对应路径路由,新增路由地址 */
    if (children.every(item => item.path !== routeLeve[0])) {
        /* 新增路由 */
        let routeMap = {}
        routeMap.path = routeLeve[0]
        routeMap.name = config.routeName
        routeMap.component = () => import( /* webpackChunkName: 'fileName' */ "newChangeUrl")
        routeMap.meta = {}
        routeMap.meta.title = config.title
        routeMap.meta.icon = config.icon
        routeMap.meta.auth = config.auth
        if (config.sidebar == true || config.sidebar == false) routeMap.meta.sidebar = config.sidebar
        children.push(routeMap)
        return children
    }
}

10.将对象编译为字符串,准备内容输出

/* 将路由json对象编译成字符串 */
function StringRoute(routeMap) {
    let str = "" + ' \r\n   '
    for (let k in routeMap) {
        if (k === "children") {
            routeMap[k] = StringRoute(routeMap[k])
            str += k + ":" + "[" + routeMap[k].toString() + "]" + "," + ' \r\n   ' + "    "
        } else if (routeMap[k] instanceof Array) {
            str += k + ":" + "['" + routeMap[k].toString() + "']" + "," + ' \r\n   ' + "    "
        } else if (typeof routeMap[k] == 'function') {
            str += k + ":" + routeMap[k].toString() + "," + ' \r\n   ' + "    "
        } else if (typeof routeMap[k] == 'object') {
            routeMap[k] = StringRoute(routeMap[k])
            if (!isNaN(Number(k)) && (routeMap.length - 1) == Number(k)) {
                /* 当前为数组 && 最后一个对象    不加逗号 */
                str += "{" + routeMap[k] + "}" + ' \r\n  ' + "    "
            } else if (!isNaN(Number(k)) && (routeMap.length - 1) != Number(k)) {
                /* 当前为数组 && 不是最后一个对象 */
                str += "{" + routeMap[k] + "}" + "," + ' \r\n  ' + "    "
            } else {
                /* 属于对象 */
                str += k + ":" + "{" + routeMap[k] + "}" + "," + ' \r\n  ' + "    "
            }
        } else {
            if (k == "sidebar") {
                str += k + ":" + routeMap[k] + "," + ' \r\n  ' + "    "
            } else {
                str += k + ":'" + routeMap[k] + "'" + "," + ' \r\n  ' + "    "
            }

        }
    }
    return str
}

11.完成路由配置,生成结束

/* 新增路由 */
function addToConf(config) {
    var routeFile = `./src/router/modules/${config.routeFile}.js`
    var result = fs.readFileSync(path.resolve(routeFile), "utf-8");
    let confStr = handleConfRouStr(result.toString(), config)
    fs.writeFileSync(path.resolve(path.resolve(routeFile)), confStr)
    shell.echo('结束生成页面')
    shell.echo('>>>>>>')
}

12.在package.json当中配置运行代码

vue快速生成template vue界面生成_node.js_03

 

"bpage": "node ./src/auto-build-page/build-page.js",

13.运行代码,生成vue文件并配置路由

npm run bpage

vue快速生成template vue界面生成_node.js_04

 

vue快速生成template vue界面生成_node.js_05