还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

这篇具有很好参考价值的文章主要介绍了还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前写过一篇文章 我理想中的低代码开发工具的形态,已经吐槽了各种封装 xxxForm,xxxTable 的行为,这里就不啰嗦了。今天再来看看我的工具达到了什么程度。

多图预警。。。

以管理后台一个列表页为例

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

选择对应的模板

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

截图查询区域,使用 OCR 初始化查询表单的配置

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

截图表头,使用 OCR 初始化 table 的配置

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

使用 ChatGPT 翻译中文字段

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

生成代码

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

效果

目前我们没有写一行代码,就已经达到了如下的效果

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

下面是一部分生成的代码

import { reactive, ref } from 'vue'

import { IFetchTableListResult } from './api'

interface ITableListItem {
  /**
   * 决算单状态
   */
  settlementStatus: string
  /**
   * 主合同编号
   */
  mainContractNumber: string
  /**
   * 客户名称
   */
  customerName: string
  /**
   * 客户手机号
   */
  customerPhone: string
  /**
   * 房屋地址
   */
  houseAddress: string
  /**
   * 工程管理
   */
  projectManagement: string
  /**
   * 接口返回的数据,新增字段不需要改 ITableListItem 直接从这里取
   */
  apiResult: IFetchTableListResult['result']['records'][0]
}

interface IFormData {
  /**
   * 决算单状态
   */
  settlementStatus?: string
  /**
   * 主合同编号
   */
  mainContractNumber?: string
  /**
   * 客户名称
   */
  customerName?: string
  /**
   * 客户手机号
   */
  customerPhone?: string
  /**
   * 工程管理
   */
  projectManagement?: string
}

interface IOptionItem {
  label: string
  value: string
}

interface IOptions {
  settlementStatus: IOptionItem[]
}

const defaultOptions: IOptions = {
  settlementStatus: [],
}

export const defaultFormData: IFormData = {
  settlementStatus: undefined,
  mainContractNumber: undefined,
  customerName: undefined,
  customerPhone: undefined,
  projectManagement: undefined,
}

export const useModel = () => {
  const filterForm = reactive<IFormData>({ ...defaultFormData })

  const options = reactive<IOptions>({ ...defaultOptions })

  const tableList = ref<(ITableListItem & { _?: unknown })[]>([])

  const pagination = reactive<{
    page: number
    pageSize: number
    total: number
  }>({
    page: 1,
    pageSize: 10,
    total: 0,
  })

  const loading = reactive<{ list: boolean }>({
    list: false,
  })

  return {
    filterForm,
    options,
    tableList,
    pagination,
    loading,
  }
}

export type Model = ReturnType<typeof useModel>

这就是用模板生成的好处,有规范,随时可以改,而封装 xxxForm,xxxTable 就是一个黑盒。

原理

下面大致说一下原理

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

首先是写好一个个模版,vscode 插件读取指定目录下模版显示到界面上

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

每个模版下可能包含如下内容:

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

选择模版后,进入动态表单配置界面

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

动态表单是读取 config/schema.json 里的内容进行动态渲染的,目前支持 amis、form-render、formily

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

配置表单是为了生成 JSON 数据,然后根据 JSON 数据生成代码。所以最终还是无法避免的使用私有的 DSL ,但是生成后的代码是没有私有 DSL 的痕迹的。生成代码本质是 JSON + EJS 模版引擎编译 src 目录下的 ejs 文件。

为了加快表单的配置,可以自定义脚本进行操作

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

这部分内容是读取 config/preview.json 内容进行显示的

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

选择对应的脚本方法后,插件会动态加载 script/index.js 脚本,并执行里面对应的方法

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

以 initColumnsFromImage 方法为例,这个方法是读取剪贴板里的图片,然后使用百度 OCR 解析出文本,再使用文本初始化表单

initColumnsFromImage: async (lowcodeContext) => {
    context.lowcodeContext = lowcodeContext;
    const res = await main.handleInitColumnsFromImage();
    return res;
  },
export async function handleInitColumnsFromImage() {
  const { lowcodeContext } = context;
  if (!lowcodeContext?.clipboardImage) {
    window.showInformationMessage('剪贴板里没有截图');
    return lowcodeContext?.model;
  }
  const ocrRes = await generalBasic({ image: lowcodeContext!.clipboardImage! });
  env.clipboard.writeText(ocrRes.words_result.map((s) => s.words).join('\r\n'));
  window.showInformationMessage('内容已经复制到剪贴板');
  const columns = ocrRes.words_result.map((s) => ({
    slot: false,
    title: s.words,
    dataIndex: s.words,
    key: s.words,
  }));
  return { ...lowcodeContext.model, columns };
}

反正就是可以根据自己的需求定义各种各样的脚本。比如使用 ChatGPT 翻译 JSON 里的指定字段,可以看我的上一篇文章 TypeChat、JSONSchemaChat实战 - 让ChatGPT更听你的话

再比如要实现把中文翻译成英文,然后英文使用驼峰语法,这样就可以将中文转成英文代码变量,下面是实现的效果

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

选择对应的命令菜单后 vscode 插件会加载对应模版里的脚本,然后执行里面的 onSelect 方法。

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

main.ts 代码如下

import { env, window, Range } from 'vscode';
import { context } from './context';

export async function bootstrap() {
  const clipboardText = await env.clipboard.readText();
  const { selection, document } = window.activeTextEditor!;
  const selectText = document.getText(selection).trim();
  let content = await context.lowcodeContext!.createChatCompletion({
    messages: [
      {
        role: 'system',
        content: `你是一个翻译家,你的目标是把中文翻译成英文单词,请翻译时使用驼峰格式,小写字母开头,不要带翻译腔,而是要翻译得自然、流畅和地道,使用优美和高雅的表达方式。请翻译下面用户输入的内容`,
      },
      {
        role: 'user',
        content: selectText || clipboardText,
      },
    ],
  });
  content = content.charAt(0).toLowerCase() + content.slice(1);
  window.activeTextEditor?.edit((editBuilder) => {
    if (window.activeTextEditor?.selection.isEmpty) {
      editBuilder.insert(window.activeTextEditor.selection.start, content);
    } else {
      editBuilder.replace(
        new Range(
          window.activeTextEditor!.selection.start,
          window.activeTextEditor!.selection.end,
        ),
        content,
      );
    }
  });
}

使用了 ChatGPT。

再来看看,之前生成管理后台 CURD 页面的时候,连 mock 也一起生成了,主要逻辑放在了 complete 方法里,这是插件的一个生命周期函数。

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

因为 mock 服务在另一个项目里,所以需要跨目录去生成代码,这里我在 mock 服务里加了个接口返回 mock 项目所在的目录

.get(`/mockProjectPath`, async (ctx, next) => {
    ctx.body = {
      status: 200,
      msg: '',
      result: __dirname,
    };
  })

生成代码的时候请求这个接口,就知道往哪个目录生成代码了

const mockProjectPathRes = await axios
      .get('http://localhost:3001/mockProjectPath', { timeout: 1000 })
      .catch(() => {
        window.showInformationMessage(
          '获取 mock 项目路径失败,跳过更新 mock 服务',
        );
      });
    if (mockProjectPathRes?.data.result) {
      const projectName = workspace.rootPath
        ?.replace(/\\/g, '/')
        .split('/')
        .pop();
      const mockRouteFile = path.join(
        mockProjectPathRes.data.result,
        `${projectName}.js`,
      );
      let mockFileContent = `
			import KoaRouter from 'koa-router';
			import proxy from '../middleware/Proxy';
			import { delay } from '../lib/util';

			const Mock = require('mockjs');

			const { Random } = Mock;

			const router = new KoaRouter();
			router{{mockScript}}
			module.exports = router;
			`;

      if (fs.existsSync(mockRouteFile)) {
        mockFileContent = fs.readFileSync(mockRouteFile).toString().toString();
        const index = mockFileContent.lastIndexOf(')') + 1;
        mockFileContent = `${mockFileContent.substring(
          0,
          index,
        )}{{mockScript}}\n${mockFileContent.substring(index)}`;
      }
      mockFileContent = mockFileContent.replace(/{{mockScript}}/g, mockScript);
      fs.writeFileSync(mockRouteFile, mockFileContent);
      try {
        execa.sync('node', [
          path.join(
            mockProjectPathRes.data.result
              .replace(/\\/g, '/')
              .replace('/src/routes', ''),
            '/node_modules/eslint/bin/eslint.js',
          ),
          mockRouteFile,
          '--resolve-plugins-relative-to',
          mockProjectPathRes.data.result
            .replace(/\\/g, '/')
            .replace('/src/routes', ''),
          '--fix',
        ]);
      } catch (err) {
        console.log(err);
      }

mock 项目也可以通过 vscode 插件快速创建和使用

还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

插件源码 https://github.com/lowcoding/lowcode-vscode

上面展示的模版都放在了 https://github.com/lowcode-scaffold/lowcode-materials 仓库里,照着 README 步骤做就可以使用了。文章来源地址https://www.toymoban.com/news/detail-781453.html

到了这里,关于还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用这个烟感监测技术!同事下巴都惊掉了!

    在当今社会,火灾作为一种极具破坏性的灾害,对人们的生命和财产安全构成着严峻的威胁。 为了更好地预防和管理火灾风险,烟感监控系统成为一项不可或缺的技术创新。为各行各业提供了全方位、高效的火灾预警和防范手段。 商业办公楼 西安某商业办公楼部署了泛地缘

    2024年01月25日
    浏览(31)
  • 还在玩传统终端,不妨来试试全新 AI 终端 Warp

    最近一段时间,AI领域如同雨后春笋般开始猛烈生长,processon,sentry,一些日常使用的工具都在积极接入AI,那么正好借着AI的风头,今天给大家推荐一款非常不错的智能终端 warp(目前仅限macOS,Windows or Linux还需要等等),如果你还在用传统终端,那么你更应该看过来。 毫不

    2023年04月25日
    浏览(31)
  • 还在手动造轮子?试试这款可以轻松集成多种支付渠道的工具!

    大家好,我是 Java陈序员 。 随着电商的兴起,各种支付也是蓬勃发展。 微信支付、支付宝支付、银联支付等各种支付方式可是深入到日常生活中。可以说,扫码支付给我们的生活带来了极大的便利。 同时,随着市场需求的变化,这也要求我们在企业开发中,需要集成第三方

    2024年02月05日
    浏览(48)
  • 天天crud?试试这个低代码框架

    hi, 后端的小伙伴,你是不是常常因为找不到漂亮的后台模板而烦恼?好不容易找到了一款却发现很难拓展?或者只有前端代码,而没有后端代码?那么从此你再也不用烦恼了,因为JNPF工具,它来了,而且100% 源代码交付! JNPF开发平台是一款基于 springboot+vue.js 的低代码开发

    2024年01月19日
    浏览(37)
  • swaggerUI不好用,试试这个openapiUI?

    由于长期使用 swaggerUI 工具,它的轻量风格个人觉得还是不错的,但是它的整体使用体验确实不好,用过的可能都有体会,这里就不一一列举了(由于语言表达能力有限,手动🐶保命,毕竟我在说鼻祖,等下会不会被砍😭) 开源的openapi文档redoc,由于默认的服务器在国外,

    2024年02月02日
    浏览(52)
  • 还在纠结报表工具的选型么?来看看这个

    数据信息化的应用与项目中,通常都会遇到报表需求,数量少的,零星需要做的,可能手工就搞定了,数量多的,长期做的,基本都会选用一个报表工具,因为长期做,就必须考虑成本了,找一个称手的工具来降本增效是非常重要的 报表工具有那么多,那就得选型,选起来复

    2024年02月02日
    浏览(48)
  • 【不单调的代码】还在嫌弃Ubuntu终端?快来试试做些Ubuntu终端的花式玩法。

    🎊专栏【不单调的代码】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 本文是在 Ubuntu环境 下进行编写的,在其他环境下的代码有可能有所不同 目录 注意:   🐂终端中出现会\\\"说话\\\"的牛

    2024年02月08日
    浏览(68)
  • 推荐试试这个简单好用的手机技巧

    技巧一:一键锁屏 除了按住手机电源键进行锁屏外,还有其他一些快捷方法可以实现锁屏操作。 对于苹果手机用户,可以按照以下步骤进行设置: 1.打开手机的设置应用,通常可以在主屏幕或应用列表中找到该图标。 2.在设置应用中查找并选择\\\"控制中心\\\"选项。这个选项可能

    2024年02月09日
    浏览(53)
  • 这个酒店管理方法太酷了!赶紧试试吧

    安全是酒店管理中最重要的优先事项之一,酒店保障住客和员工的生命安全是不可妥协的责任。为了有效预防和应对潜在的火灾风险,引入烟感监控系统是一种普遍且高效的解决方案。 烟感监控系统通过及时检测烟雾和火源,及时发出警报和采取措施,从而能够在火灾发生前

    2024年02月14日
    浏览(38)
  • javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满

    高并发三驾马车:分库分表、MQ、缓存。今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现。 一款支持自动分表分库的orm框架 easy-query 帮助您解脱跨库带来的复杂业务代码,并且提供多种结局方案和自定义路由来实现比

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包