文档中心
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • 前端工程化
  • Laravel
  • MySql
  • Linux
  • 公众号与小程序
  • 其他
  • vue-element-admin
  • vue-antd-admin
  • VuePress
  • 《JavaScript教程》
  • 《JavaScript高级程序设计》
  • 《ES6 教程》
  • 《Vue》
  • 《React》
  • 《TypeScript 从零实现 axios》
  • 《Git》
  • TypeScript
  • vue-element-admin集成模板
  • 商品进销存管理系统
  • 民主测评管理系统
  • 在线考试系统
  • 股票分析系统
  • 利用vue.js和vue-element-admin开发管理系统
  • PHP开发微信公众号
  • Laravel开发RESTful API
  • uni-app开发微信小程序
技术文摘
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
关于
收藏
  • 分类
  • 标签
  • 归档

Evan Xu

前端界的小学生
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • 前端工程化
  • Laravel
  • MySql
  • Linux
  • 公众号与小程序
  • 其他
  • vue-element-admin
  • vue-antd-admin
  • VuePress
  • 《JavaScript教程》
  • 《JavaScript高级程序设计》
  • 《ES6 教程》
  • 《Vue》
  • 《React》
  • 《TypeScript 从零实现 axios》
  • 《Git》
  • TypeScript
  • vue-element-admin集成模板
  • 商品进销存管理系统
  • 民主测评管理系统
  • 在线考试系统
  • 股票分析系统
  • 利用vue.js和vue-element-admin开发管理系统
  • PHP开发微信公众号
  • Laravel开发RESTful API
  • uni-app开发微信小程序
技术文摘
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
关于
收藏
  • 分类
  • 标签
  • 归档
  • vue-element-admin

    • 认识vue-element-admin
    • vue-element-admin中利用模板快速生成代码
      • 需求
      • vue-element-admin的一般开发
      • 分析
      • 问题与解决之道
      • 解决过程
        • 1.安装模块到开发依赖
        • 2.获取用户的输入
        • 3.文件的打开与读写
        • 4.全部代码
        • 5.效果
    • 管理后台常用组件
    • 富文本编辑器
    • 混入Minix
    • 制作网站的favicon
  • vue-antd-admin

  • VuePress

  • element-ui

  • antd-vue

  • vex-table

  • uview

  • echarts

  • tduck

  • crmeb

  • 框架与库
  • vue-element-admin
wmhello
2021-11-29
目录

vue-element-admin中利用模板快速生成代码

# vue-element-admin中利用模板快速生成代码

# 需求

vue-element-admin进行前端开发时,许多代码是相同的,不停的ctrl+v, 改名等,效率低下 因此我们可以把相同的内容做成为模板,利用nodejs的本地文件处理功能,来快速生成新的代码,提高工作效率

# vue-element-admin的一般开发

  1. 接口(api目录)
  2. 模型(model目录)
  3. 页面(views目录)
  4. 路由(router)

# 分析

每个页面的开发都离不开这4步骤,每个页面中的各个步骤,内容变化不大,虽然可以使用ctrl+v,但效率不高,而且部分内容可能还要修改

比如修改文件名称 后端路由的名称等

对于这样的重复性工作,最好的方式是让程序自动进行

# 问题与解决之道

1.文件的读取 文件的删除 文件的保存等基本操作(fs模块)

2.模板中内容的替换(string.replace 字符串的常用函数 正则表达式等)

3.要获取我们输入的参数(readline模块 process.avg 等)

# 解决过程

# 1.安装模块到开发依赖

npm install --save-dev fs readline stdio
1

# 2.获取用户的输入

const readline = require("readline");

function rlPromisify(fn) {
    return async (...args) => {
        return new Promise(resolve => fn(...args, resolve));
    };
}
// 判断全部都是小写字母
function strIsLower(str){
  let bool = true;
  for(let i =0; i<=str.length; i++) {
    if (str.charCodeAt(i) < 97 || str.charCodeAt > 122) {
      bool = false;
      break;
    }
  }
  return bool;
}

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const question = rlPromisify(rl.question.bind(rl));

(async () => {
    // 如果 空内容 重新输入, 不是小写字母,重新输入
    let moduleName ='';
     do {
       moduleName = await question("请输入模型名称(全部小写):");
     } while (! moduleName || ! strIsLower(moduleName));
      rl.close();

})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 3.文件的打开与读写

    // 根据模板生成接口文件
    let apiFile = `src/api/${moduleName}.js`
    let modelFile = `src/model/${moduleName}.js`
    let result = fs.readFileSync('src/api/template.js')
    let code = result.toString();
    let str = code.replace('##name##', routerName)
    fs.writeFileSync(apiFile, str)
    console.log('生成接口文件成功')

1
2
3
4
5
6
7
8
9

# 4.全部代码

let fs = require('fs')
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const question = rlPromisify(rl.question.bind(rl));
(async () => {
    // 如果首字符不大写 要重新输入  空内容 重新输入
    let moduleName ='';
     do {
       moduleName = await question("请输入模型名称(全部小写):");
     } while (! moduleName || ! strIsLower(moduleName));

    let routerName ='';
     do {
       routerName = await question("请输入路由名称(建议小写、复数):");
     } while (! routerName || ! strIsLower(moduleName));

     let pageType = 2
     do {
      pageType = await question("请输入页面类型(1-简单-不包括分页和查询  2-正常-功能全面):")
      pageType = parseInt(pageType)
    } while (pageType !== 1 && pageType !==2 )

    rl.close();

    // 根据模板生成接口文件
    let apiFile = `src/api/${moduleName}.js`
    let modelFile = `src/model/${moduleName}.js`
    let result = fs.readFileSync('src/api/template.js')
    let code = result.toString();
    let str = code.replace('##name##', routerName)
    fs.writeFileSync(apiFile, str)
    console.log('生成接口文件成功')

    // 根据模型模板文件生成模型文件
    result = fs.readFileSync('src/model/template.js')
    code = result.toString();
    fs.writeFileSync(modelFile, code)
    console.log('生成模型文件成功')
    //根据模型名生成页面视图

    let path = `src/views/${moduleName}`
    if (fs.existsSync(path)) {
       deleteall(path)
     }
    fs.mkdirSync(path)
    if (pageType===2) {
      result = fs.readFileSync('src/views/template/index.vue')
    } else {
      result = fs.readFileSync('src/views/template/simple.vue')
    }

    let component = moduleName.charAt(0).toUpperCase() + moduleName.slice(1) + 'Index'
    result = result.toString();
    code = result.replace('##component##', component)
    code = code.replace('##name##', moduleName)
    fs.writeFileSync(`src/views/${moduleName}/index.vue`, code)
    console.log('生成页面文件成功');
  })();
// 删除文件夹以及下面的内容
function deleteall(path) {
  var files = [];
  if(fs.existsSync(path)) {
    files = fs.readdirSync(path);
    files.forEach(function(file, index) {
      var curPath = path + "/" + file;
      if(fs.statSync(curPath).isDirectory()) { // recurse
        deleteall(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};

function rlPromisify(fn) {
    return async (...args) => {
        return new Promise(resolve => fn(...args, resolve));
    };
}

function strIsLower(str){
  let bool = true;
  for(let i =0; i<=str.length; i++) {
    if (str.charCodeAt(i) < 97 || str.charCodeAt > 122) {
      bool = false;
      break;
    }
  }
  return bool;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

# 5.效果

#framework#vue-element-admin
认识vue-element-admin
管理后台常用组件

← 认识vue-element-admin 管理后台常用组件→

最近更新
01
使用VuePress搭建博客系统(一)
08-08
02
利用FreeSSL.cn申请免费SSL证书
07-23
03
民主测评管理系统
07-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 wmhello |备案号:滇ICP备2023013341号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式