el-form 校验单个字段

2023-11-19

单个校验 核心为 validateField() 而非validate()

    <el-form
      :inline="false"
      :rules="rules"
      :model="formInline"
      ref="formInline"
      class="demo-form-inline"
      label-width="185px"
    >
      <el-form-item label="协管协议:" prop="escrowFiles" inline-message="true">
        // 此处↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        <FileUploadIndexS :types="['pdf']" @escrowFilesEmit="(val) => {escrowFilesEmit(val,'escrowFiles')}" />
      </el-form-item>
      <el-form-item  label="协管协议照片:" prop="escrowImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
      <el-form-item label="资产移交手续:" prop="assetFiles">
        <FileUploadIndexS :types="['pdf']" @assetImgsEmit="assetImgsEmit"  />
      </el-form-item>
      <el-form-item label="资产移交手续照片:" prop="assetImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
    </el-form>

    /* 协议文件 */
    escrowFilesEmit({ url,name },prop){
    this.formInline.escrowFiles = [...this.formInline.escrowFiles,{filesUr:url,filesName:name}]
    this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

 完整代码

父组件 

<!--
 * @Author       : qixiao
 * @Date         : 2023-06-28 22:03:07
 * @LastEditors  : qixiao
 * @LastEditTime : 2023-07-03 12:07:51
 * @FilePath     : \第三方\Sanfang-project\src\views\thirdunit\project\protect.vue
 * @Description  : 
 * 
-->
<template>
  <div class="pages">
    <!-- 1.项目详情 -->
    <p class="detail_tit">项目详情</p>
    <!-- 1.1 详细描述 -->
    <el-descriptions
      title=""
      :column="4"
      border
      class="margin-top centers"
      direction="vertical"
    >
      <el-descriptions-item label="管护主体">{{
        detailList.supervisorName
      }}</el-descriptions-item>
      <el-descriptions-item label="负责人">{{
        detailList.contacts
      }}</el-descriptions-item>
      <el-descriptions-item label="项目地址">{{
        detailList.county + detailList.town + detailList.village
      }}</el-descriptions-item>
      <el-descriptions-item label="联系电话">{{
        detailList.contactsPhone
      }}</el-descriptions-item>
    </el-descriptions>
    <!-- 2.合同及供应商信息 -->
    <p class="detail_tit bottoms">合同及供应商信息</p>
    <el-form
      :inline="false"
      :rules="rules"
      :model="formInline"
      ref="formInline"
      class="demo-form-inline"
      label-width="185px"
    >
      <el-form-item label="协管协议:" prop="escrowFiles" inline-message="true">
        <FileUploadIndexS :types="['pdf']" @escrowFilesEmit="(val) => {escrowFilesEmit(val,'escrowFiles')}" />
      </el-form-item>
      <el-form-item  label="协管协议照片:" prop="escrowImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
      <el-form-item label="资产移交手续:" prop="assetFiles">
        <FileUploadIndexS :types="['pdf']" @assetImgsEmit="assetImgsEmit"  />
      </el-form-item>
      <el-form-item label="资产移交手续照片:" prop="assetImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
    </el-form>
    <!-- 3.保存 -->
    <div class="fotter">
      <el-button type="primary" @click="Ctrl_S('formInline')">保 存</el-button>
      <el-button type="info">取 消</el-button>
    </div>
  </div>
</template>

<script>
import FileUploadIndexS from "@/views/components/construction/FileUploadIndexS.vue";
export default {
  components: { FileUploadIndexS },
  props: [],
  data() {
    /* 托管协议文件 */
    var escrowFilesRules = (rule, value, callback, source) => {
      if (this.formInline.escrowFiles.length == 0) {
        callback(new Error("托管协议文件不能为空"));
      } else {
        callback();
      }
    };
    /* 协管协议照片 */
    var escrowImgsRules = (rule, value, callback, source) => {
      if (this.formInline.escrowImgs.length == 0) {
        callback(new Error("协管协议照片为空"));
      } else {
        callback();
      }
    };
    /* 资产移交手续 */
    var assetFilesRules = (rule, value, callback, source) => {
      if (this.formInline.assetFiles.length == 0) {
        callback(new Error("资产移交手续不能为空"));
      } else {
        callback();
      }
    };
    /* 资产移交手续照片 */
    var assetImgsRules = (rule, value, callback, source) => {
      if (this.formInline.assetImgs.length == 0) {
        callback(new Error("资产移交手续照片不能为空"));
      } else {
        callback();
      }
    };
    return {
      /* 描述列表 */
      detailList: {},
      /* route传参 */
      routeDate: this.$route.query.id,
      /* form */
      formInline: {
        escrowFiles: [],
        escrowImgs: [],
        assetFiles: [],
        assetImgs: [],
      },
      rules: {
        escrowFiles: [
          {
            required: true,
            message: "协管协议不能为空",
            trigger: "change",
            validator: escrowFilesRules,
          },
        ],
        escrowImgs: [
          {
            required: true,
            message: "协管协议照片不能为空",
            trigger: "change",
            validator: escrowImgsRules,
          },
        ],
        assetFiles: [
          {
            required: true,
            message: "资产移交手续",
            trigger: "change",
            validator: assetFilesRules,
          },
        ],
        assetImgs: [
          {
            required: true,
            message: "资产移交手续照片",
            trigger: "change",
            validator: assetImgsRules,
          },
        ],
      },
    };
  },
  mounted() {},
  created() {},
  methods: {
    /* 保存 */
    Ctrl_S(formName){
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
    },

    /* 协议文件 */
    escrowFilesEmit({ url,name },prop){
    this.formInline.escrowFiles = [...this.formInline.escrowFiles,{filesUr:url,filesName:name}]
    this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

    /* 手续文件 */
    assetImgsEmit({url,name},prop){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

    /* 手续文件 */
    assetImgsEmit({url,name}){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validate();
    },
    /* 手续文件 */
    assetImgsEmit({url,name}){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validate();
    },
  },
};
</script>

<style lang='scss' scoped>
.pages {
  ::v-deep
    .centers
    .el-descriptions__body
    .el-descriptions__table
    .el-descriptions-item__label {
    text-align: center !important;
  }
  ::v-deep
    .centers
    .el-descriptions__body
    .el-descriptions__table
    .el-descriptions-item__content {
    text-align: center !important;
  }
  .bottoms {
    margin-top: 20px;
  }
  .fotter {
    margin-top: 20px;
    width: 100%;
    height: 40px;
    text-align: center;
  }
  ::v-deep .el-form-item__error{
    /* form校验样式 */
    // left:185px;
  }
}
</style>

 

子组件(文件、图片上传组件)
src\views\components\construction\FileUploadIndexS.vue

<!--
 * @Author       : qixiao
 * @Date         : 2023-06-29 09:50:43
 * @LastEditors: liushumin
 * @LastEditTime: 2023-06-29 22:17:04
 * @FilePath     : \第三方\Sanfang-project\src\views\components\construction\FileUploadIndexS.vue
 * @Description  : 
 * 
-->
<template>
  <div class="upload-file">
    <el-upload
      :action="uploadFileUrl"
      :limit="limit"
      :list-type="types.includes('pdf') ? 'none' : 'picture-card'"
      :on-preview="handlePictureCardPreview"
      :on-remove="handleRemove"
      :file-list="fileList"
      :http-request="myUpload"
      :before-upload="handleBeforeUpload"
    >
      <i v-if="!types.includes('pdf') ? (!text ? true :false) : false" class="el-icon-plus"></i>
      <el-button
        v-if="
          types.includes('pdf')
            ? limit == fileList.length
              ? false
              : true
            : false
        "
        >点击上传</el-button
      >
      <span v-if="text ? (limit == fileList.length ? false : true) : false"
        >上传</span
      >
    </el-upload>
    <el-dialog
      title="图片预览"
      :append-to-body="true"
      :visible.sync="dialogVisible"
    >
      <img
        style="max-height: 70vh; max-width: 100%"
        :src="dialogImageUrl"
        alt=""
      />
    </el-dialog>
  </div>
</template>

<script>
export default {
  components: {},
  props: ["limit", "types", "text"],
  data() {
    return {
      dialogImageUrl: "", //预览
      dialogVisible: false, //预览
      uploadFileUrl: process.env.VUE_APP_BASE_API + "/nt/common/file/upload", // 上传文件服务器地址
      fileList: [],

      // ["png", "jpg", "jpeg","pdf"]
      fileType: this.types, //文件格式
      fileSize: 60, //文件大小
    };
  },
  watch:{
    "fileList"(J,K){
      if(J.length == this.limit) {
        let dom = document.querySelector(".el-upload");
        dom.style.setProperty("display","block")
      }
    }
  },
  mounted() {},
  created() {},
  methods: {
    handleRemove(file, fileList) {
      console.log(file);
      console.log(fileList);
      let arr = [];
      this.fileList = [];
      fileList.map((item) => arr.push(item.url));
      fileList.map((item) => this.fileList.push({ url: item.url }));
      console.log(arr);
      this.$emit("remove", arr);
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      if (!file.url.includes(".pdf")) {
        this.dialogVisible = true;
      } else {
        window.open(file.url);
      }
    },
    myUpload(content) {
      console.log(content);
      let param = new FormData(); // 创建form对象
      param.append("uploadfile", content.file, content.file.name);
      param.append("source", "gb"); // 高标
      const loading = this.$loading({
        lock: true,
        text: "上传中,请稍等",
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)",
      });
      console.log(param);
      this.axios({
        url: content.action,
        method: "post",
        headers: {
          Authorization: window.localStorage.getItem("TokenKey") || "",
        },
        data: param,
      }).then((response) => {
        if (response.data.code == 200) {
          console.log(response.data.data);
          loading.close();
          content.onSuccess(response.data.data);
          this.$nextTick(() => {
            this.fileList.push({
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
          });
          console.log(response.data.data.result.url);
          console.log(this.limit, this.fileList.length);
          if (response.data.data.result.url.includes(".pdf")) {
            this.$emit("pdfEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
            /* 协管协议: */
            this.$emit("escrowFilesEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
            /* 资产移交手续: */
            this.$emit("assetImgsEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
          } else {
            this.$emit("imgUrl", response.data.data.result.url);
            /* 协管协议照片 */
            this.$emit("escrowImgsEmit", response.data.data.result.url);
            /* 资产移交手续照片 */
            this.$emit("assetImgsEmit", response.data.data.result.url);
          }
        }
        console.log(this.fileList);
      });
    },
    // 上传前校检格式和大小
    handleBeforeUpload(multipartFile) {
      // 校检文件类型
      if (this.fileType) {
        const fileName = multipartFile.name.split(".");
        const fileExt = fileName[fileName.length - 1];
        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
        if (!isTypeOk) {
          this.$modal.msgError(
            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
          );
          return false;
        }
      }
      // 校检文件大小
      if (this.fileSize) {
        const isLt = multipartFile.size / 1024 / 1024 < this.fileSize;
        if (!isLt) {
          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
          return false;
        }
      }
      this.$modal.loading("正在上传文件,请稍候...");
      this.number++;
      return true;
    },
  },
};
</script>

<style lang="scss" scoped>
::v-deep .el-dialog__body {
  padding: 20px 20px 30px 20px !important;
  text-align: center;
}

::v-deep .el-upload-list__item.is-success:focus:not(:hover) {
  display: none !important;
}
</style>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

el-form 校验单个字段 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 为什么我的淘汰单选按钮在另一个具有点击绑定的元素内时会失败?

    我有一个单选按钮列表 我想要点击 li 他们还检查单选按钮 这一切都有效 直到我放了一个name单选元素上的属性 然后我的代码停止工作 我的代码如下所示 ul li li ul li
  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 在新的 Google 协作平台 <嵌入 HTML> 中使用 localStorage 和 IndexedDB 不起作用

    我正在尝试将新的 Google 协作平台用于我开发的网页 但是 我在存储本地数据时遇到了问题 本地文件在 Windows 和 Apple safari chrome 中运行良好 从 Google 协作平台尝试一下 没有什么乐趣 此外 在 s
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐

  • 什么是模式、什么是模式识别、模式识别的方法、过程

    什么是模式 pattern 模式是存在于时间和空间中可观察的物体 如果可以区分相同或者相似的物体类别 可区分的物体称之为模式 模式不是指具体的物体 而是抽象的类别 例如 人这个类别是一种模式 自行车这个类别是一种模式 什么是模式识别 1 模
  • 用Python爬取英雄联盟(lol)全部皮肤

    小三 怎么了小二 一副无精打采的样子 小二 唉 别提了 还不是最近又接触了一个叫英雄联盟的游戏 游戏中很多皮肤都需要花钱买 但是我钱不够呀 小三 咋得 钱攒够了你还要买呀 还吃不吃饭了 要我说 你干脆将英雄的炫彩皮肤都爬下来欣赏一下得了 饭
  • 预警:传统的QA岗位将被DevOps淘汰

    导读 在大多数机构或公司里 软件开发过程主要遵循一个或多个开发模型 例如瀑布模型或敏捷模型 在瀑布模型中 测试活动一般都在后期进行 软件开发完成后 缺陷被QA团队找出 然后再被修复 后两个活动不断循环和重复 指导管理者认为软件可以被公开发布
  • 在wsl中判断wsl的版本是wsl1还是wsl2

    判断wsl的版本 代码逻辑 通过判断 cat proc version 是否包含wsl等字符来判断wsl的版本 代码 bin bash Get the content of proc version proc version cat pro
  • chatgpt赋能python:如何用Python进行SEO优化

    如何用Python进行SEO优化 介绍 Search Engine Optimization SEO 即搜索引擎优化 是提高网站排名和流量的关键 Python作为一种强大的编程语言 可以帮助我们优化网站的SEO 在本文中 我们将探讨如何用P
  • 如何批量Ping 1000个IP地址,一个小技巧节约N小时?

    一 批量ping网段 对于一个网段ip地址众多 如果单个检测实在麻烦 那么我们可以直接批量ping网段检测 那个ip地址出了问题 一目了然 先看代码 直接在命令行窗口输入 for L D in 1 1 255 do ping 10 168
  • 定义类数组

    编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toString 方法显示所有属性 3 在测试类中定义学生数组 长度为4 分别给数组每个元素赋值 然后循环调用
  • Vue自定义插件的编写

    如何实现一个vue的自定义插件 div div
  • windows 如何查询主板sn(主板ID)

    wmic bios get serialnumber
  • dell服务器维护软件,Dell服务器硬件,RAID等查询和维护软件OMSA_推荐

    Dell服务器硬件 RAID等查询和维护软件OMSA 推荐 原创 chenshengang2014 01 17 19 07 03 著作权 阅读数 441 著作权归作者所有 来自51CTO博客作者chenshengang的原创作品 如需转载
  • Java 读取resources下的资源文件

    Web项目中应该经常有这样的需求 在maven项目的resources目录下放一些文件 比如一些配置文件 资源文件等 文件的读取方式有好几种方式 本文会对常用的读取方式做一个总结 并说明一下应该注意的地方 准备工作 新建一个spring t
  • 无向图染色问题-dfs剪枝

    无向图染色问题 问题描述 给定一个无向图 要求用最少的颜色将节点染色 限制是不能让相邻节点染上相同的颜色 算法 使用dfs 为节点分配不同的颜色进行尝试 计算每种分配所需的颜色数 最终进行回溯 取得最小的颜色数 代码 C include
  • OpenAI最新发布通用人工智能路线图!AGI比想象中来得更快!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 转载自 机器之心 编辑 泽南 小舟 通用人工智能的出现可能只是技术发展历程中的一个小节点 因为 AGI 或许可以加速自身的进
  • 点云/网格模型的体积计算

    点云体积计算 有时用激光扫描设备扫描零件或者用无人机进行测量后会想知道它们的体积 比如下面的土堆 如果扫描得到的数据是一系列三维点云 那么体积就比较难求 因为如何定义物体的边界比较困难 一种方法是提取三维点云的凸壳 包络体 然后再进行计算
  • 第五章 数据清洗

    5 1数据去重 5 1 1完全去重 点击 获取字段 配置csv文件输入的属性 Name Gender City 配置唯一行属性 选择要去重的属性 Name Gender City 运行结果 完全去重成功 5 1 2不完全去重 将文本分隔符替
  • 支付宝短视频平台创作分成激励项目

    没想到支付宝也开通了中视频计划 这波羊毛算是蒿定了 最近啊 马爸爸火速上线了支付宝创作分成计划 明显就是抄的抖音中视频计划 目前还在内测阶段 补贴的力度非常大 错过的话就只能拍大腿了 看到短视频这么的火爆 巨头大佬们都想分一杯羹啊 阿里也不
  • Linux下MySQL启动、停止、重启的几种方式

    一 启动 1 使用service 启动 service mysqld start 2 使用 mysqld 脚本启动 etc inint d mysqld start 3 使用 safe mysqld 启动 safe mysqld 二 停止
  • 互联网产品上线流程,及面试题分类

    一 基础情况 问题1 自我介绍 3mins 与自我介绍 1min 问题2 为什么你要来这个行业 问题3 为什么你要来这个岗位 问题4 为什么你能胜任这份工作 问题5 为什么你要离职 问题6 过往经历STAR故事描述 问题7 你的职业规划是什
  • php mes代码,完整MES代码(含客户端和server端)

    实例简介 完整的代码 带数据库文件 包含客户端 服务端 实例截图 核心代码 MES 源代码 MES 源代码 MES 源代码 dll AjaxControlToolkit dll AspNetServer dll AxInterop CELL
  • el-form 校验单个字段

    单个校验 核心为 validateField 而非validate