赞
踩
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,定义替换设置数据
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当中配置运行代码
"bpage": "node ./src/auto-build-page/build-page.js",
13.运行代码,生成vue文件并配置路由
npm run bpage
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。