【sgCreateReadonlyForm】自定义小工具:敏捷开发→自动化生成只读表单代码片段脚本(无需列表展示数据,多用于查看某一条数据记录)

news2024/9/20 22:53:48

sgCreateReadonlyForm源码 

<template>
  <!-- 
前往https://blog.csdn.net/qq_37860634/article/details/141389231
查看使用说明
-->
  <div :class="$options.name">
    <div class="sg-head">
      只读表单生成工具<el-dropdown
        :show-timeout="0"
        :split-button="false"
        :placement="`bottom`"
        @command="$router.push(`/demo?id=${$event}`).catch(() => true)"
      >
        <el-button
          style="margin-left: 10px"
          type="primary"
          size="mini"
          icon="el-icon-more"
          plain
          title="更多"
          circle
        />
        <el-dropdown-menu
          slot="dropdown"
          style="transition: none; overflow-y: auto; max-height: 400px; margin-top: 5px"
        >
          <el-dropdown-item
            :command="item.command"
            v-for="(item, index) in dropdownItems"
            :key="index"
            :divided="item.divided"
            v-if="
              item.hasOwnProperty('hide')
                ? typeof item.hide === 'function'
                  ? !item.hide(item)
                  : !item.hide
                : true
            "
            :active="item.command == dropdownActive"
            :disabled="item.command == dropdownActive"
          >
            <template>
              <i :class="item.icon" v-if="item.icon" />{{ item.label }}</template
            >
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
    <div class="sg-container">
      <div class="sg-start">
        <div style="margin-bottom: 10px">字段中文名</div>
        <div style="display: flex; margin-bottom: 10px">
          <el-select
            style="width: 150px"
            v-model="selectValue_type"
            @change="(d) => {}"
            :placeholder="`请选择数据内容类型`"
          >
            <el-option
              v-for="(select, index) in selectOptions_type"
              :key="index"
              :value="select.value"
              :label="select.label"
              :disabled="select.disabled"
            ></el-option>
          </el-select>
          <template v-if="selectValue_type == 2">
            <div style="display: flex; align-items: center; margin-left: 10px">
              <label style="margin-right: 5px">fieldName</label>
              <el-input
                style="width: 150px"
                ref="fieldName"
                v-model.trim="fieldNameValue"
                maxlength="20"
                :show-word-limit="false"
                :placeholder="`字段名`"
                @focus="$refs.fieldName.select()"
                clearable
              />

              <label style="margin-left: 10px; margin-right: 5px">keyName</label>
              <el-input
                style="width: 150px"
                ref="keyName"
                v-model.trim="keyNameValue"
                maxlength="20"
                :show-word-limit="false"
                :placeholder="`字段值名`"
                @focus="$refs.keyName.select()"
                clearable
              />
            </div>
          </template>
        </div>
        <el-input
          ref="textareaValue1"
          style="margin-bottom: 10px"
          type="textarea"
          :placeholder="
            this.selectOptions_type.find((v) => v.value == this.selectValue_type)
              .placeholder
          "
          v-model.trim="textareaValue1"
          show-word-limit
        />

        <el-button type="primary" @click="createResult">生成表格数据</el-button>
      </div>
      <div class="sg-center">→</div>

      <div class="sg-end">
        <div style="margin-bottom: 10px">生成结果</div>
        <el-input
          style="margin-bottom: 10px"
          type="textarea"
          :placeholder="`请复制结果`"
          v-model.trim="textareaValue2"
          show-word-limit
        />

        <el-button type="primary" @click="copyResult">复制</el-button>
      </div>
    </div>
  </div>
</template>

<script>
import pinyin from "@/js/pinyin";
export default {
  name: "sgCreateReadonlyForm",
  data() {
    return {
      dropdownActive: this.$route.query.id,
      dropdownItems: [
        { label: "接口代码生成工具", command: "demoCreateAPI" },
        { label: "接口方法生成工具", command: "demoCreateAPIFunction" },
        { label: "表格列生成工具", command: "demoCreateTableColumn" },
        { label: "表格数据生成工具", command: "demoCreateTableData" },
        { label: "表单生成工具", command: "demoCreateForm" },
        { label: "只读表单生成工具", command: "demoCreateReadonlyForm" },
        { label: "拼音生成工具", command: "demoCreatePinyin" },
      ],

      selectOptions_type: [
        {
          value: 1,
          label: "文本",
          placeholder: `请粘贴字段中文名(或者:字段英文名+空格+字段中文名)`,
        },
        { value: 2, label: "json数据", placeholder: `请粘贴键值对描述json数组` },
      ],

      selectValue_type: 1,

      fieldNameValue: `fieldName`,
      keyNameValue: `fieldName_TEXT`,

      textareaValue1: "",
      textareaValue2: "",
    };
  },
  watch: {
    textareaValue1(newValue, oldValue) {
      newValue && this.createResult(newValue);
    },
  },
  methods: {
    createResult(d) {
      let formFieldData = {}; //表单的字段对象(描述字段名的键值对)
      switch (this.selectValue_type) {
        case 1:
          let texts = this.textareaValue1
            .split("\n")
            .map((v) => v.split("\t").join("").trim());
          texts = texts.filter((v, i, ar) => v !== ``);

          texts.map((v) => {
            let strings = v.replace(/\s+/g, ` `).split(` `); //用空格分隔开两列字段名
            let label = ``;
            let prop = ``;
            // 如果是多列内容
            if (strings.length > 1) {
              // 如果第一列的字符串是中文
              if (this.$g.checkEverything(`cn`, strings[0])) {
                label = strings[0];
                prop = strings[1];
              } else {
                label = strings[1];
                prop = strings[0];
              }
            } else {
              // 如果是单列内容
              prop = pinyin.getCamelChars(v);
              label = v;
            }
            formFieldData[prop] = label;
          });

          break;
        case 2:
          if (this.fieldNameValue && this.keyNameValue) {
          } else {
            return this.$message.error(`fieldName和keyName都要填写`);
          }
          if (this.$g.json.isJSON(this.textareaValue1)) {
            let arr = JSON.parse(this.textareaValue1);
            arr.map((v) => {
              let prop = v[this.fieldNameValue];
              let label = v[this.keyNameValue];
              formFieldData[prop] = label;
            });
          } else {
            return this.$message.error(`请输入正确的json格式的对象数组内容`);
          }

          break;
      }
      this.textareaValue2 = this.createFormHTML(formFieldData);
      this.copyResult(); //自动复制生成结果
    },
    createFormHTML(formFieldData) {
      let r = ``;
      Object.keys(formFieldData || {}).forEach((k) => {
        let itemData = { key: k.replace(/[^a-zA-Z]/g, ""), value: formFieldData[k] };
        r += `${this.createFormItemHTML(itemData)}\n`;
      });
      return `<el-form @submit.native.prevent label-position="right" size="mini" >\n${r}</el-form>`;
    },
    createFormItemHTML(itemData) {
      let formItem = `<el-form-item :label="\`${itemData.value}\`" label-width="80px">
    <span>{{form.${itemData.key}}}</span>
</el-form-item>`;
      return formItem;
    },
    copyResult(d) {
      this.$g.copy(this.textareaValue2, true);
      this.$nextTick(() => {
        this.$refs.textareaValue1.select();
      });
    },
  },
};
</script>

<style lang="scss" scoped>
.sgCreateReadonlyForm {
  width: 100%;
  height: 100%;
  position: absolute;
  box-sizing: border-box;
  padding: 20px;

  .sg-head {
    display: flex;
    align-items: center;
    font-size: 24px;
    font-weight: bold;
    color: #409eff;
    margin-bottom: 10px;
  }

  .sg-container {
    display: flex;
    flex-wrap: nowrap;
    height: calc(100vh - 70px);

    & > .sg-start {
      width: calc(50% - 20px);
      height: 100%;
      flex-shrink: 0;
      display: flex;
      flex-direction: column;
    }

    & > .sg-center {
      display: flex;
      justify-content: center;
      align-items: center;
      flex-grow: 1;
      margin: 0 10px;
      font-size: 24px;
      color: #409eff;
      font-weight: bold;
    }

    & > .sg-end {
      width: calc(50% - 20px);
      height: 100%;
      flex-shrink: 0;
      display: flex;
      flex-direction: column;
    }

    >>> .el-textarea {
      width: 100%;
      height: 100%;
      textarea {
        width: 100%;
        height: 100%;
        max-height: revert;
      }
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.20 roles的基本用法+使用剧本安装nginx

安装nginx并更改其端口 创建目录 mkdir /etc/ansible/playbook 编辑配置文件 vim /etc/ansible/palybook/nginx.yml --- - hosts: s remote_user: root tasks: - name: 卸载httpd yu…

人工智能 | 结对编程助手GithubCopilot

简介 GitHub Copilot 是一款 AI 结对程序员&#xff0c;可帮助您更快、更少地编写代码。它从注释和代码中提取上下文&#xff0c;以立即建议单独的行和整个函数。GitHub Copilot 由 GitHub、OpenAI 和 Microsoft 开发的生成式 AI 模型提供支持。它可作为 Visual Studio Code、…

智慧水务平台:数智化驱动,‌实现管理全面升级!‌

智慧生产体系聚焦水务行业的生产环节,涵盖水源管理、水厂管理、生产调度、二次供水管理等各个环节。对各生产环节的实时生产数据和设备运行参数进行监测,并提供报警、日常运维、能耗分析、流程优化,为水务生产管理的成本压降、效率提升、安全保障、服务优化提供支撑。 智慧管网…

Echarts添加水印

如果直接说水印,很难在官方找到一些痕迹,但是换个词【纹理】就能找到了。水印就是一种特殊的纹理背景。 Echarts-backgroundColor backgroundColor 支持使用rgb(255,255,255),rgba(255,255,255,1),#fff等方式设置为纯色,也支持设置为渐变色和纹理填充,具体见option.colo…

哪个牌子的开放式耳机性价比高?五款地表最强机型推荐!

在我们的日常生活中&#xff0c;街道、地铁车厢或公交车等地方常常充满了噪音&#xff0c;这些杂音不仅可能扰乱心情&#xff0c;还可能对我们的听力造成潜在的伤害。在这样的环境下&#xff0c;如果想要享受音乐或追剧&#xff0c;同时又能保持对周围环境的警觉&#xff0c;开…

充电宝哪个品牌好?360度全方面测评热门款充电宝

在这个智能手机、平板电脑等移动设备普及的时代&#xff0c;充电宝已成为我们日常生活中不可或缺的伴侣。无论是在通勤途中、旅行出行&#xff0c;还是在户外运动时&#xff0c;充电宝都能为我们的设备提供源源不断的电力支持。然而&#xff0c;市场上充电宝品牌众多&#xff0…

c++开发,下载安装Boost库并检测是否安装成功

c开发&#xff0c;下载安装Boost库并检测是否安装成功 系统说明下载Boost库安装测试验证 系统说明 win10系统 下载Boost库 从官方网站下载&#xff0c;点击版本号 进去后选择windows系统的下载 安装 第1步 将下载后的压缩包解压到你想存储的文件夹中&#xff0c;比如我这里…

自主身份:Web3如何重新定义个人数据所有权

随着数字时代的快速发展&#xff0c;个人数据成为了一种新型的资产&#xff0c;深刻影响着我们的生活。然而&#xff0c;在Web2时代&#xff0c;个人数据往往被科技巨头所掌控&#xff0c;用户在享受互联网服务时&#xff0c;无意中失去了对自己数据的控制权。Web3的到来&#…

Java 调整字符串,验证码生成

package text7;public class ZiFanz {public static void main(String[] args) {//1.定义两个字符串String strA "abcde";String strB "deabc";//2.abcde->bcdea->cdeab->deabc旋转字符串//旋转并比较boolean result cheak(strA, strB);System…

时间序列分析中的特征提取

一、说明 在多变量时间序列分析期间&#xff0c;数据包含随时间推移测量的多个数据。为了管理模型性能&#xff0c;建议进行特征提取&#xff0c;以使模型的数据点更加紧凑。 二、时间序列的挑战 2.1 特征提取 仅选择“信息性”特征&#xff0c;这些特征在多变量时间序列分析…

【Java】了解线程 Thread 类的使用,如何创建、终止、等待一个线程,一文读懂不迷路

线程是什么 线程是操作系统中调度的基本单位&#xff0c;是比进程更小的执行单元。线程在进程内部运行&#xff0c;共享该进程的资源&#xff0c;如内存和文件句柄&#xff0c;但每个线程都有自己的执行栈和程序计数器。 线程的主要特点包括&#xff1a; 轻量级&#xff1a;…

格式工厂怎么转换mp4?简单4步实现视频转换

视频转换的重要性不言而喻。随着科技的发展&#xff0c;视频已经成为我们生活中不可或缺的一部分。然而&#xff0c;不同的设备和平台往往支持不同的视频格式&#xff0c;这就导致了视频兼容性问题。此外&#xff0c;不同格式的视频文件在存储和传输方面也存在差异。因此&#…

【MySQL】数据库基础与MySQL的安装

1. 数据库基础 1.1 什么是数据库 在接触数据库之前&#xff0c;回想一下我们之前写的所有小项目&#xff0c;如果需要持久化保存一些内容&#xff0c;我们是保存在文件中的&#xff0c;似乎也能够很不错的支持我们的操作&#xff0c;解决我们的需求。但是&#xff0c;实际上是…

健身房管理系统的设计与实现设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Redis7基础篇(七)

redis哨兵&#xff08;sentinel&#xff09; 目录 redis哨兵&#xff08;sentinel&#xff09; 是什么 能干吗 案例演示 架构 案例步骤 出现的问题 哨兵的运行流程和选举原理 哨兵的使用建议​编辑 是什么 在之前的复制中我们了解到 主机shutdown之后 从机就会一直等…

轻松创作高质量的AI音乐——Suno API

Suno 歌曲生成 API 对接指南 随着人工智能技术的飞速发展&#xff0c;各类 AI 程序已如雨后春笋般涌现。AI 不再是遥不可及的存在&#xff0c;它的身影深入了人类工作与生活的每一个角落。其应用领域也愈加广泛&#xff0c;从初期的写作&#xff0c;到现如今的医疗、教育&…

为什么同一台手机连着电脑的ip地址不一样

在现代社会中&#xff0c;网络已成为我们日常生活不可或缺的一部分。从日常办公到休闲娱乐&#xff0c;网络无处不在。然而&#xff0c;在享受网络带来的便利时&#xff0c;我们可能会遇到一些看似复杂实则有趣的网络现象。今天&#xff0c;我们就来探讨一个常见却又容易被忽视…

LLM | 面向对话式医疗健康场景的医疗大模型

近日&#xff0c;复旦大学数据智能与社会计算实验室 (Fudan-DISC) 开发并开源了一个专门针对医疗健康对话式场景而设计的医疗领域大模型&#xff1a;DISC-MedLLM。 DISC-MedLLM DISC-MedLLM 是一个专为医疗健康对话场景而打造的领域大模型&#xff0c;它可以满足您的各种医疗保…

嵌入式堆栈、ARM寄存器

栈里面存放的内容&#xff1a;局部变量和系统信息&#xff0c;函数调用链路也是系统信息的一环 ARM寄存器 LR&#xff1a;程序跳转的时候&#xff0c;返回到的地址就保存到此处 PC&#xff1a;程序计数器&#xff0c;pc 要执行的下一条指令地址&#xff0c;就存放在此处&#…

Obsidian Publish的开源替代品Markopolis

什么是 Markopolis &#xff1f; Markopolis 是一款旨在提供 Markdown 文件的 Web 应用和 API 服务器。它允许您以网站形式共享 Markdown 笔记&#xff0c;并使用 API 与 Markdown 文件交互和操作它们。类似于 Obsidian Publish&#xff0c;但又不会被锁定在 Obsidian 生态系统…