当前位置:   article > 正文

自动化构建vue页面_vue可视化自动生成页面以及绑定接口

vue可视化自动生成页面以及绑定接口

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

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

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

  1. var addConfig = require('./addConfig')
  2. var fs = require('fs')
  3. var path = require('path')
  4. var shell = require('shelljs')

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

  1. addConfig.forEach((config) => {
  2. if (config.open) {
  3. var paths
  4. if (config.addFile) {
  5. /* 生成文件夹 */
  6. paths = path.resolve(`./src/views/${config.pagePath}/${config.name}`)
  7. } else {
  8. /* 不生成文件夹 */
  9. paths = path.resolve(`./src/views/${config.pagePath}`)
  10. }
  11. shell.echo('页面地址:' + paths)
  12. shell.echo('文件状态:' + fs.existsSync(paths))
  13. if (fs.existsSync(paths)) {
  14. /* 存在相同文件 删除后新建文件夹 */
  15. removeDir(config, paths)
  16. buildPage(config, paths)
  17. } else {
  18. /* 不存在相同文件 新建文件夹 */
  19. buildPage(config, paths)
  20. }
  21. }
  22. })

3.1删除相同文件

  1. /* 删除文件夹 */
  2. function removeDir(config, paths) {
  3. shell.echo(config.addFile)
  4. if (config.addFile) {
  5. /* 新增目录 */
  6. let files = fs.readdirSync(paths)
  7. for (var i = 0; i < files.length; i++) {
  8. let newPath = path.join(paths, files[i]);
  9. shell.echo('删除文件:' + newPath)
  10. let stat = fs.statSync(newPath)
  11. if (stat.isDirectory()) {
  12. //如果是文件夹就递归下去
  13. removeDir(config, newPath);
  14. } else {
  15. //删除文件
  16. fs.unlinkSync(newPath);
  17. }
  18. }
  19. fs.rmdirSync(paths) //如果文件夹是空的,就将自己删除掉
  20. } else {
  21. /* 新增文件 */
  22. let newPath = path.join(paths, `/${config.VueName}`);
  23. if (fs.existsSync(newPath)) {
  24. fs.unlinkSync(newPath);
  25. }
  26. }
  27. }

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

 

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

  1. function buildPage(config, paths) {
  2. shell.echo('页面地址:' + paths)
  3. if (config.addFile) {
  4. /* 新增文件夹后新增文件 */
  5. fs.mkdirSync(paths, (function () {
  6. fs.readFile(path.resolve(`./src/auto-build-page/template/${config.templateName}`), (err, data) => {
  7. if (!err) {
  8. writePage(data.toString(), paths, config)
  9. }
  10. })
  11. }()))
  12. } else {
  13. /* 直接新增文件 */
  14. fs.readFile(path.resolve(`./src/auto-build-page/template/${config.templateName}`), (err, data) => {
  15. if (!err) {
  16. writePage(data.toString(), paths, config)
  17. }
  18. })
  19. }
  20. }

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

  1. /* 替换vue模板中指定内容 */
  2. function handleStr(str, config) {
  3. if (config.helloworld) {
  4. return str
  5. }
  6. let map = config.pageInfo
  7. for (let k in map) {
  8. if (k == "tableJson") {
  9. var jsonList = require(`./tableJson/${map[k]}`)
  10. str = str.replace('%el-table-column%', handleTable(jsonList))
  11. } else {
  12. str = str.replace(`%${k}%`, map[k])
  13. }
  14. }
  15. r

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

  1. function writePage(vueStr, paths, config) {
  2. str = handleStr(
  3. vueStr,
  4. config
  5. )
  6. fs.writeFile(`${paths}/${config.VueName}`, str, (e) => {})
  7. shell.echo('开始新增路由……')
  8. /* 新增路由异步执行 */
  9. addToConf(config)
  10. }

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

  1. function handleConfRouStr(ori, config) {
  2. let str = ori.split('export default')
  3. let routeMap = eval('(' + str[1] + ')')
  4. if (routeMap.children) {
  5. routeMap.children = recurRoute(routeMap.children, `${config.routePath}/${config.routeName}`, config)
  6. // shell.echo('修改的路由>>>')
  7. // shell.echo(routeMap.toString())
  8. }
  9. routeMap = `{${StringRoute(routeMap)}}`
  10. var pagePath = config.addFile ? `${config.pagePath}/${config.name}` : config.pagePath
  11. let url = `@/views/${pagePath}/${config.VueName}`
  12. shell.echo("地址 :" + url)
  13. routeMap = routeMap.replace('newChangeUrl', url)
  14. routeMap = routeMap.replace('fileName', config.routeFile)
  15. ori = [str[0], routeMap].join('export default')
  16. return ori
  17. }

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

  1. /* 递归处理路由 将新增内容填充至合适位置 */
  2. function recurRoute(children, routePath, config) {
  3. let routeLeve = routePath.split('/').filter((v, i) => i > 0)
  4. /* 修改路由之后的内容不变 */
  5. if (routeLeve.length <= 0) {
  6. return children
  7. }
  8. /* 找到需要继续向下找的对应路径 */
  9. if (children.some(item => item.path === routeLeve[0])) {
  10. /* 是否存在children */
  11. let result = children.map(item => {
  12. if (item.path === routeLeve[0] && routeLeve.length === 1) {
  13. item.path = routeLeve[0]
  14. item.name = config.routeName
  15. item.component = () => import( /* webpackChunkName: 'fileName' */ "newChangeUrl")
  16. item.meta = {}
  17. item.meta.title = config.title
  18. item.meta.icon = config.icon
  19. item.meta.auth = config.auth
  20. if (config.sidebar == true || config.sidebar == false) item.meta.sidebar = config.sidebar
  21. return item
  22. } else if (item.path === routeLeve[0] && routeLeve.length > 1) {
  23. if (!item.children) {
  24. item.children = []
  25. item.children = recurRoute(item.children, routeLeve.join('/'), config)
  26. return item
  27. } else {
  28. item.children = recurRoute(item.children, routeLeve.join('/'), config)
  29. return item
  30. }
  31. } else {
  32. return item
  33. }
  34. })
  35. return result
  36. }
  37. /* 找不到对应路径路由,新增路由地址 */
  38. if (children.every(item => item.path !== routeLeve[0])) {
  39. /* 新增路由 */
  40. let routeMap = {}
  41. routeMap.path = routeLeve[0]
  42. routeMap.name = config.routeName
  43. routeMap.component = () => import( /* webpackChunkName: 'fileName' */ "newChangeUrl")
  44. routeMap.meta = {}
  45. routeMap.meta.title = config.title
  46. routeMap.meta.icon = config.icon
  47. routeMap.meta.auth = config.auth
  48. if (config.sidebar == true || config.sidebar == false) routeMap.meta.sidebar = config.sidebar
  49. children.push(routeMap)
  50. return children
  51. }
  52. }

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

  1. /* 将路由json对象编译成字符串 */
  2. function StringRoute(routeMap) {
  3. let str = "" + ' \r\n '
  4. for (let k in routeMap) {
  5. if (k === "children") {
  6. routeMap[k] = StringRoute(routeMap[k])
  7. str += k + ":" + "[" + routeMap[k].toString() + "]" + "," + ' \r\n ' + " "
  8. } else if (routeMap[k] instanceof Array) {
  9. str += k + ":" + "['" + routeMap[k].toString() + "']" + "," + ' \r\n ' + " "
  10. } else if (typeof routeMap[k] == 'function') {
  11. str += k + ":" + routeMap[k].toString() + "," + ' \r\n ' + " "
  12. } else if (typeof routeMap[k] == 'object') {
  13. routeMap[k] = StringRoute(routeMap[k])
  14. if (!isNaN(Number(k)) && (routeMap.length - 1) == Number(k)) {
  15. /* 当前为数组 && 最后一个对象 不加逗号 */
  16. str += "{" + routeMap[k] + "}" + ' \r\n ' + " "
  17. } else if (!isNaN(Number(k)) && (routeMap.length - 1) != Number(k)) {
  18. /* 当前为数组 && 不是最后一个对象 */
  19. str += "{" + routeMap[k] + "}" + "," + ' \r\n ' + " "
  20. } else {
  21. /* 属于对象 */
  22. str += k + ":" + "{" + routeMap[k] + "}" + "," + ' \r\n ' + " "
  23. }
  24. } else {
  25. if (k == "sidebar") {
  26. str += k + ":" + routeMap[k] + "," + ' \r\n ' + " "
  27. } else {
  28. str += k + ":'" + routeMap[k] + "'" + "," + ' \r\n ' + " "
  29. }
  30. }
  31. }
  32. return str
  33. }

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

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

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

 

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

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

npm run bpage

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/231520
推荐阅读
相关标签
  

闽ICP备14008679号