瀏覽代碼

新增辅助构建代码工具

olym 7 年之前
父節點
當前提交
7671ba374a
共有 6 個文件被更改,包括 256 次插入1 次删除
  1. 3 1
      .eslintrc
  2. 18 0
      README.zh-CN.md
  3. 165 0
      tool/builder.js
  4. 28 0
      tool/templates/controller.txt
  5. 28 0
      tool/templates/service.txt
  6. 14 0
      tool/templates/view.txt

+ 3 - 1
.eslintrc

@@ -12,6 +12,8 @@
         // 链式调用是否强制换行
         "newline-per-chained-call": 0,
         // 换行风格
-        "linebreak-style": [0, "windows"]
+        "linebreak-style": [0, "windows"],
+        // switch case中可以定义变量
+        "no-case-declarations": 0
     }
 }

+ 18 - 0
README.zh-CN.md

@@ -46,5 +46,23 @@ $ npm test            线上运行单元测试
 - 使用 `npm test` 来执行单元测试。
 - 使用 `npm run autod` 来自动检测依赖更新,详细参见 [autod](https://www.npmjs.com/package/autod) 。
 
+### 自动生成代码
+```text
+// 生成控制器代码 (脚本会自动添加到对应位置)
+node tool/builder.js controller:名称
+
+// 生成service代码 (脚本会自动添加到对应位置)
+// 表名table为可选参数 不填入则默认为名称的小写
+node tool/builder.js service:名称 table:表名
+
+// 生成view代码
+// 脚本会自动生成对应名称的文件夹
+// 表名folder为可选参数 不填入则默认为名称的小写
+node tool/builder.js view:名称 folder:文件夹名称
+
+// 生成一整套代码
+// 参数与上面一致
+node tool/builder.js all:名称 table:表名 folder:文件夹名称
+```
 
 [egg]: https://eggjs.org

+ 165 - 0
tool/builder.js

@@ -0,0 +1,165 @@
+#!/usr/bin/env node
+'use strict';
+
+/**
+ * 代码生成器
+ *
+ * @author CaiAoLin
+ * @date 2018/2/1
+ * @version
+ */
+
+const path = require('path');
+const fs = require('fs');
+
+const command = [];
+const params = {};
+const rootDir = path.resolve(__dirname, '..');
+const appDir = rootDir + '\\app\\';
+const controllerDir = appDir + 'controller\\';
+const serviceDir = appDir + 'service\\';
+const viewDir = appDir + 'view\\';
+const templateDir = rootDir + '\\tool\\templates\\';
+
+process.argv.forEach(function(param, index) {
+    // 前两个命令忽略 (node 以及当前js目录)
+    if (index <= 1) {
+        return false;
+    }
+    if (index === 2) {
+        // 记录命令
+        command.push(param);
+    } else {
+        const paramInfo = param.split(':');
+        params[paramInfo[0]] = paramInfo.length !== 2 ? '' : paramInfo[1];
+    }
+
+});
+
+if (command.length <= 0) {
+    console.log('命令错误!');
+}
+
+const moduleCommand = command[0];
+selectModule(moduleCommand);
+
+/**
+ * 模块选择
+ *
+ * @param {String} moduleCommand - 模块命令
+ * @return {void}
+ */
+function selectModule(moduleCommand) {
+    const commandInfo = moduleCommand.split(':');
+    if (commandInfo.length !== 2) {
+        console.log('命令参数错误');
+        return;
+    }
+    // 读入模板数据
+    const templateFile = templateDir + commandInfo[0] + '.txt';
+    const templateContent = fs.existsSync(templateFile) ? fs.readFileSync(templateFile) : '';
+    switch (commandInfo[0]) {
+        case 'controller':
+            addFile(commandInfo[1], templateContent, 'controller');
+            break;
+        case 'service':
+            addFile(commandInfo[1], templateContent, 'service');
+            break;
+        case 'all':
+            const controllerContent = fs.readFileSync(templateDir + 'controller.txt');
+            const serviceContent = fs.readFileSync(templateDir + 'service.txt');
+            const viewContent = fs.readFileSync(templateDir + 'view.txt');
+            addFile(commandInfo[1], controllerContent, 'controller');
+            addFile(commandInfo[1], serviceContent, 'service');
+            addFile(commandInfo[1], viewContent, 'view');
+            break;
+        default:
+            break;
+    }
+}
+
+/**
+ * 新增文件
+ *
+ * @param {String} name - 文件名
+ * @param {String} content - 写入内容
+ * @param {String} type - 文件类型
+ * @return {void}
+ */
+function addFile(name, content, type) {
+    // 模板变量定义
+    const current = new Date();
+    const templateData = {
+        date: current.getFullYear() + '/' + (current.getMonth() + 1) + '/' + current.getDate(),
+    };
+    let fileName = '';
+    let writeDir = '';
+    switch (type) {
+        case 'controller':
+            fileName = name + '_controller.js';
+            // 处理文件大小写
+            templateData.name = convertName(name);
+            writeDir = controllerDir + fileName;
+            break;
+        case 'service':
+            fileName = name + '.js';
+            // 处理文件大小写
+            templateData.name = convertName(name);
+            templateData.table = params.table === undefined ? name.toLowerCase() : params.table;
+            writeDir = serviceDir + fileName;
+            break;
+        case 'view':
+            // 判断是否有对应的文件夹
+            const folderName = params.folder === undefined ? name.toLowerCase() : params.folder;
+            const folder = viewDir + folderName;
+            if (!fs.existsSync(folder)) {
+                fs.mkdirSync(folder);
+            }
+            fileName = name + '.ejs';
+            writeDir = folder + '\\' + fileName;
+            break;
+        default:
+            console.log('不支持对应的模块');
+            return;
+    }
+    // 替换模板变量
+    content = templateVarReplace(content, templateData);
+    // 写入文件
+    fs.writeFileSync(writeDir, content);
+}
+
+/**
+ * 替换模板变量
+ *
+ * @param {String} content - 模板文件内容
+ * @param {Object} templateData - 变量替换内容
+ * @return {String} - 返回替换后的内容
+ */
+function templateVarReplace(content, templateData) {
+    content = content.toString();
+    if (templateData.name !== undefined) {
+        content = content.replace(/{{NAME}}/g, templateData.name);
+    }
+    if (templateData.date !== undefined) {
+        content = content.replace(/{{DATE}}/g, templateData.date);
+    }
+    if (templateData.table !== undefined) {
+        content = content.replace(/{{TABLE}}/g, templateData.table);
+    }
+    return content;
+}
+
+/**
+ * 处理文件名(把test_test转换为大驼峰模式TestTest)
+ *
+ * @param {String} content - 待转换内容
+ * @return {String} - 转换后的结果
+ */
+function convertName(content) {
+    let result = '';
+    const contentArray = content.split('_');
+    for (const tmp of contentArray) {
+        result += tmp.substring(0, 1).toUpperCase() + tmp.substring(1);
+    }
+    return result;
+}

+ 28 - 0
tool/templates/controller.txt

@@ -0,0 +1,28 @@
+'use strict';
+
+/**
+ * 添加注释
+ *
+ * @author 添加作者
+ * @date {{DATE}}
+ * @version
+ */
+
+module.exports = app => {
+
+    class {{NAME}}Controller extends app.BaseController {
+
+        /**
+         * 列表页面
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async index(ctx) {
+
+        }
+
+    }
+
+    return {{NAME}}Controller;
+};

+ 28 - 0
tool/templates/service.txt

@@ -0,0 +1,28 @@
+'use strict';
+
+/**
+ * 添加注释
+ *
+ * @author 添加作者
+ * @date {{DATE}}
+ * @version
+ */
+
+module.exports = app => {
+
+    class {{NAME}} extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = '{{TABLE}}';
+        }
+    }
+
+    return {{NAME}};
+};

+ 14 - 0
tool/templates/view.txt

@@ -0,0 +1,14 @@
+<% include ../layout/body_header.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main">
+            <h2><%= ctx.menu.children[ctx.actionName].name %>
+            <a href="#ver" data-toggle="modal" data-target="#add-user" class="btn btn-primary btn-sm pull-right">添加xx</a>
+            </h2>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-body">
+        </div>
+    </div>
+</div>