不要再Ctrlc,ctrlv了,快试试用程序的思想来生成业务代码

614 阅读2分钟

对于开发管理系统的前端开发人员来说,一个页面基本上就是增删改查的业务,一个页面基本上都是筛选(查询)、表格、弹框(新增/修改),复制一个模板页面之后,根据接口字段来修改,这都是重复性的劳动,那么既然是重复性的劳动,那么就可以用程序来解决。

自动生成思路

  • 模板替换
  • openapi接口读取

实现

  1. 既然要根据模板来生成,那么肯定需要一些模板,比如使用elementui,就可以准备elementui的表单组件模板,比如输入框模板
<el-form-item prop="#${prop}" label="#${label}">
<el-input
  v-model="dataForm.#${prop}"
  placeholder="请输入#${label}"
  clearable
></el-input>
</el-form-item>
  1. 第二步就需要读取准备的这些模板了,我们可以先用以下结构来组织模板文件

Snipaste_2023-05-25_14-50-03.png

读取模板代码字符串如下所示

async function getTemplate (templateName, _path) {
    const filePath = _path ? path.resolve(process.cwd(), _path, templateName) : path.resolve(__dirname, `../templates/${templateName}-template.html`)
    let isFile = await is_file(filePath)
    if (isFile) {
        try {
            return (await fs.readFile(filePath)).toString()
        } catch (err) {
            return Promise.reject(err)
        }
    } else {
        return Promise.reject("模板文件不存在,请检查文件路径")
    }

}
  1. 读取之后需要对代码进行替换,用正则匹配到#${key}之后,将#${key}替换成params[key]值
  2. 那么有小伙伴要说了,如果我这个#${key}要替换成的值,也是用模板生成的呢,那么,就需要用递归继续获取模板替换的值,也就是下方代码所示
/**
 * 递归模板填充
 */
async function replaceState (arr) {
    if (typeof arr === 'string') return arr
    if (Array.isArray(arr)) {
        let temparr = []
        for (let i = 0; i < arr.length; i++) {
            let templateStr
            if (arr[i].template) {
                templateStr = await getTemplate(arr[i].template, arr[i].templatePath)
            }
            if (templateStr && typeof arr[i].params === 'object') {
                for (let key in arr[i].params) {
                    arr[i].params[key] = await replaceState(arr[i].params[key])
                }
                templateStr = replaceMatch(templateStr, arr[i].params)
                temparr.push(templateStr)
            }
        }
        return temparr.join("\n")
    } else {
        return ""
    }

}

最后效果如下图所示:

fgh1.gif

怎么才能不手写增删改查字段

对于上方的程序来说,还是需要我们对照接口文档进行增删改查字段的填充,那么如何才能不手写字段,做一个快乐的摸鱼工程师呢,那么就是需要分析接口文档。

  • 如果文档可以导出openapi.json的话,那么就很好办了,就是分析openapi.json的结构,一般都能自动构建成功,
  • 如果文档导不出openapi.json,只有一个html的话,那么使用爬虫把页面爬取下来,再分析页面结构

虽然上面方法看起来有些麻烦,但是基本上可以节省很多的对接口的时间。

我这边已经将代码上传了,有兴趣的小伙伴可以去试试看: yinyangshibolange/hy-template-gen: dynactic genorate template code (github.com)

npm可以搜索hy-template-gen