国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

這篇具有很好參考價(jià)值的文章主要介紹了還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

之前寫過一篇文章 我理想中的低代碼開發(fā)工具的形態(tài),已經(jīng)吐槽了各種封裝 xxxForm,xxxTable 的行為,這里就不啰嗦了。今天再來看看我的工具達(dá)到了什么程度。

多圖預(yù)警。。。

以管理后臺(tái)一個(gè)列表頁為例

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

選擇對(duì)應(yīng)的模板

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

截圖查詢區(qū)域,使用 OCR 初始化查詢表單的配置

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

截圖表頭,使用 OCR 初始化 table 的配置

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

使用 ChatGPT 翻譯中文字段

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

生成代碼

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

效果

目前我們沒有寫一行代碼,就已經(jīng)達(dá)到了如下的效果

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

下面是一部分生成的代碼

import { reactive, ref } from 'vue'

import { IFetchTableListResult } from './api'

interface ITableListItem {
  /**
   * 決算單狀態(tài)
   */
  settlementStatus: string
  /**
   * 主合同編號(hào)
   */
  mainContractNumber: string
  /**
   * 客戶名稱
   */
  customerName: string
  /**
   * 客戶手機(jī)號(hào)
   */
  customerPhone: string
  /**
   * 房屋地址
   */
  houseAddress: string
  /**
   * 工程管理
   */
  projectManagement: string
  /**
   * 接口返回的數(shù)據(jù),新增字段不需要改 ITableListItem 直接從這里取
   */
  apiResult: IFetchTableListResult['result']['records'][0]
}

interface IFormData {
  /**
   * 決算單狀態(tài)
   */
  settlementStatus?: string
  /**
   * 主合同編號(hào)
   */
  mainContractNumber?: string
  /**
   * 客戶名稱
   */
  customerName?: string
  /**
   * 客戶手機(jī)號(hào)
   */
  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>

這就是用模板生成的好處,有規(guī)范,隨時(shí)可以改,而封裝 xxxForm,xxxTable 就是一個(gè)黑盒。

原理

下面大致說一下原理

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

首先是寫好一個(gè)個(gè)模版,vscode 插件讀取指定目錄下模版顯示到界面上

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

每個(gè)模版下可能包含如下內(nèi)容:

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

選擇模版后,進(jìn)入動(dòng)態(tài)表單配置界面

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

動(dòng)態(tài)表單是讀取 config/schema.json 里的內(nèi)容進(jìn)行動(dòng)態(tài)渲染的,目前支持 amis、form-render、formily

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

配置表單是為了生成 JSON 數(shù)據(jù),然后根據(jù) JSON 數(shù)據(jù)生成代碼。所以最終還是無法避免的使用私有的 DSL ,但是生成后的代碼是沒有私有 DSL 的痕跡的。生成代碼本質(zhì)是 JSON + EJS 模版引擎編譯 src 目錄下的 ejs 文件。

為了加快表單的配置,可以自定義腳本進(jìn)行操作

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

這部分內(nèi)容是讀取 config/preview.json 內(nèi)容進(jìn)行顯示的

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

選擇對(duì)應(yīng)的腳本方法后,插件會(huì)動(dòng)態(tài)加載 script/index.js 腳本,并執(zhí)行里面對(duì)應(yīng)的方法

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

以 initColumnsFromImage 方法為例,這個(gè)方法是讀取剪貼板里的圖片,然后使用百度 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('內(nèi)容已經(jīng)復(fù)制到剪貼板');
  const columns = ocrRes.words_result.map((s) => ({
    slot: false,
    title: s.words,
    dataIndex: s.words,
    key: s.words,
  }));
  return { ...lowcodeContext.model, columns };
}

反正就是可以根據(jù)自己的需求定義各種各樣的腳本。比如使用 ChatGPT 翻譯 JSON 里的指定字段,可以看我的上一篇文章 TypeChat、JSONSchemaChat實(shí)戰(zhàn) - 讓ChatGPT更聽你的話

再比如要實(shí)現(xiàn)把中文翻譯成英文,然后英文使用駝峰語法,這樣就可以將中文轉(zhuǎn)成英文代碼變量,下面是實(shí)現(xiàn)的效果

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

選擇對(duì)應(yīng)的命令菜單后 vscode 插件會(huì)加載對(duì)應(yīng)模版里的腳本,然后執(zhí)行里面的 onSelect 方法。

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

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: `你是一個(gè)翻譯家,你的目標(biāo)是把中文翻譯成英文單詞,請(qǐng)翻譯時(shí)使用駝峰格式,小寫字母開頭,不要帶翻譯腔,而是要翻譯得自然、流暢和地道,使用優(yōu)美和高雅的表達(dá)方式。請(qǐng)翻譯下面用戶輸入的內(nèi)容`,
      },
      {
        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。

再來看看,之前生成管理后臺(tái) CURD 頁面的時(shí)候,連 mock 也一起生成了,主要邏輯放在了 complete 方法里,這是插件的一個(gè)生命周期函數(shù)。

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

因?yàn)?mock 服務(wù)在另一個(gè)項(xiàng)目里,所以需要跨目錄去生成代碼,這里我在 mock 服務(wù)里加了個(gè)接口返回 mock 項(xiàng)目所在的目錄

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

生成代碼的時(shí)候請(qǐng)求這個(gè)接口,就知道往哪個(gè)目錄生成代碼了

const mockProjectPathRes = await axios
      .get('http://localhost:3001/mockProjectPath', { timeout: 1000 })
      .catch(() => {
        window.showInformationMessage(
          '獲取 mock 項(xiàng)目路徑失敗,跳過更新 mock 服務(wù)',
        );
      });
    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 項(xiàng)目也可以通過 vscode 插件快速創(chuàng)建和使用

還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具

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

上面展示的模版都放在了 https://github.com/lowcode-scaffold/lowcode-materials 倉庫里,照著 README 步驟做就可以使用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-781453.html

到了這里,關(guān)于還在封裝 xxxForm,xxxTable 殘害你的同事?試試這個(gè)工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 用這個(gè)煙感監(jiān)測(cè)技術(shù)!同事下巴都驚掉了!

    用這個(gè)煙感監(jiān)測(cè)技術(shù)!同事下巴都驚掉了!

    在當(dāng)今社會(huì),火災(zāi)作為一種極具破壞性的災(zāi)害,對(duì)人們的生命和財(cái)產(chǎn)安全構(gòu)成著嚴(yán)峻的威脅。 為了更好地預(yù)防和管理火災(zāi)風(fēng)險(xiǎn),煙感監(jiān)控系統(tǒng)成為一項(xiàng)不可或缺的技術(shù)創(chuàng)新。為各行各業(yè)提供了全方位、高效的火災(zāi)預(yù)警和防范手段。 商業(yè)辦公樓 西安某商業(yè)辦公樓部署了泛地緣

    2024年01月25日
    瀏覽(17)
  • 還在玩?zhèn)鹘y(tǒng)終端,不妨來試試全新 AI 終端 Warp

    還在玩?zhèn)鹘y(tǒng)終端,不妨來試試全新 AI 終端 Warp

    最近一段時(shí)間,AI領(lǐng)域如同雨后春筍般開始猛烈生長(zhǎng),processon,sentry,一些日常使用的工具都在積極接入AI,那么正好借著AI的風(fēng)頭,今天給大家推薦一款非常不錯(cuò)的智能終端 warp(目前僅限macOS,Windows or Linux還需要等等),如果你還在用傳統(tǒng)終端,那么你更應(yīng)該看過來。 毫不

    2023年04月25日
    瀏覽(20)
  • 還在手動(dòng)造輪子?試試這款可以輕松集成多種支付渠道的工具!

    大家好,我是 Java陳序員 。 隨著電商的興起,各種支付也是蓬勃發(fā)展。 微信支付、支付寶支付、銀聯(lián)支付等各種支付方式可是深入到日常生活中??梢哉f,掃碼支付給我們的生活帶來了極大的便利。 同時(shí),隨著市場(chǎng)需求的變化,這也要求我們?cè)谄髽I(yè)開發(fā)中,需要集成第三方

    2024年02月05日
    瀏覽(14)
  • 天天crud?試試這個(gè)低代碼框架

    天天crud?試試這個(gè)低代碼框架

    hi,?后端的小伙伴,你是不是常常因?yàn)檎也坏狡恋暮笈_(tái)模板而煩惱?好不容易找到了一款卻發(fā)現(xiàn)很難拓展?或者只有前端代碼,而沒有后端代碼?那么從此你再也不用煩惱了,因?yàn)镴NPF工具,它來了,而且100%?源代碼交付! JNPF開發(fā)平臺(tái)是一款基于 springboot+vue.js 的低代碼開發(fā)

    2024年01月19日
    瀏覽(25)
  • swaggerUI不好用,試試這個(gè)openapiUI?

    swaggerUI不好用,試試這個(gè)openapiUI?

    由于長(zhǎng)期使用 swaggerUI 工具,它的輕量風(fēng)格個(gè)人覺得還是不錯(cuò)的,但是它的整體使用體驗(yàn)確實(shí)不好,用過的可能都有體會(huì),這里就不一一列舉了(由于語言表達(dá)能力有限,手動(dòng)??保命,畢竟我在說鼻祖,等下會(huì)不會(huì)被砍??) 開源的openapi文檔redoc,由于默認(rèn)的服務(wù)器在國外,

    2024年02月02日
    瀏覽(46)
  • 還在糾結(jié)報(bào)表工具的選型么?來看看這個(gè)

    還在糾結(jié)報(bào)表工具的選型么?來看看這個(gè)

    數(shù)據(jù)信息化的應(yīng)用與項(xiàng)目中,通常都會(huì)遇到報(bào)表需求,數(shù)量少的,零星需要做的,可能手工就搞定了,數(shù)量多的,長(zhǎng)期做的,基本都會(huì)選用一個(gè)報(bào)表工具,因?yàn)殚L(zhǎng)期做,就必須考慮成本了,找一個(gè)稱手的工具來降本增效是非常重要的 報(bào)表工具有那么多,那就得選型,選起來復(fù)

    2024年02月02日
    瀏覽(22)
  • 【不單調(diào)的代碼】還在嫌棄Ubuntu終端?快來試試做些Ubuntu終端的花式玩法。

    【不單調(diào)的代碼】還在嫌棄Ubuntu終端?快來試試做些Ubuntu終端的花式玩法。

    ??專欄【不單調(diào)的代碼】 ??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。 ??音樂分享【Love Story】 ??大一同學(xué)小吉,歡迎并且感謝大家指出我的問題?? 本文是在 Ubuntu環(huán)境 下進(jìn)行編寫的,在其他環(huán)境下的代碼有可能有所不同 目錄 注意: ? ??終端中出現(xiàn)會(huì)\\\"說話\\\"的牛

    2024年02月08日
    瀏覽(47)
  • 推薦試試這個(gè)簡(jiǎn)單好用的手機(jī)技巧

    推薦試試這個(gè)簡(jiǎn)單好用的手機(jī)技巧

    技巧一:一鍵鎖屏 除了按住手機(jī)電源鍵進(jìn)行鎖屏外,還有其他一些快捷方法可以實(shí)現(xiàn)鎖屏操作。 對(duì)于蘋果手機(jī)用戶,可以按照以下步驟進(jìn)行設(shè)置: 1.打開手機(jī)的設(shè)置應(yīng)用,通??梢栽谥髌聊换驊?yīng)用列表中找到該圖標(biāo)。 2.在設(shè)置應(yīng)用中查找并選擇\\\"控制中心\\\"選項(xiàng)。這個(gè)選項(xiàng)可能

    2024年02月09日
    瀏覽(19)
  • 這個(gè)酒店管理方法太酷了!趕緊試試吧

    這個(gè)酒店管理方法太酷了!趕緊試試吧

    安全是酒店管理中最重要的優(yōu)先事項(xiàng)之一,酒店保障住客和員工的生命安全是不可妥協(xié)的責(zé)任。為了有效預(yù)防和應(yīng)對(duì)潛在的火災(zāi)風(fēng)險(xiǎn),引入煙感監(jiān)控系統(tǒng)是一種普遍且高效的解決方案。 煙感監(jiān)控系統(tǒng)通過及時(shí)檢測(cè)煙霧和火源,及時(shí)發(fā)出警報(bào)和采取措施,從而能夠在火災(zāi)發(fā)生前

    2024年02月14日
    瀏覽(16)
  • javaer你還在手寫分表分庫?來看看這個(gè)框架怎么做的 干貨滿滿

    javaer你還在手寫分表分庫?來看看這個(gè)框架怎么做的 干貨滿滿

    高并發(fā)三駕馬車:分庫分表、MQ、緩存。今天給大家?guī)淼木褪欠謳旆直淼母韶浗鉀Q方案,哪怕你不用我的框架也可以從中聽到不一樣的結(jié)局方案和實(shí)現(xiàn)。 一款支持自動(dòng)分表分庫的orm框架 easy-query 幫助您解脫跨庫帶來的復(fù)雜業(yè)務(wù)代碼,并且提供多種結(jié)局方案和自定義路由來實(shí)現(xiàn)比

    2024年02月06日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包