黑马智数Day5

news2024/9/27 7:23:06

表单校验

表单基础校验

// 1. 创建表单规则
data() {
  return {
    addRules: {
      name: [
        { required: true, message: '企业名称为必填', trigger: 'blur' }
      ],
      legalPerson: [
        { required: true, message: '法人为必填', trigger: 'blur' }
      ],
      registeredAddress: [
        { required: true, message: '注册地址为必填', trigger: 'blur' }
      ],
      industryCode: [
        { required: true, message: '所在行业为必填', trigger: 'change' }
      ],
      contact: [
        { required: true, message: '企业联系人为必填', trigger: 'blur' }
      ],
      contactNumber: [
        { required: true, message: '企业联系人电话为必填', trigger: 'blur' }
      ],
      businessLicenseId: [
        { required: true, message: '请上传营业执照', trigger: 'blur' }
      ]
    }
  }
}

// 2. 绑定表单规则
<el-form :model="addForm" :rules="addRules" label-width="100px">
  <el-form-item label="企业名称" prop="name">
    <el-input v-model="addForm.name" />
  </el-form-item>
  <el-form-item label="法人" prop="legalPerson">
    <el-input v-model="addForm.legalPerson" />
  </el-form-item>
  <el-form-item label="注册地址" prop="registeredAddress">
    <el-input v-model="addForm.registeredAddress" />
  </el-form-item>
  <el-form-item label="所在行业" prop="industryCode">
    <el-select v-model="addForm.industryCode">
      <el-option
        v-for="item in industryList"
        :key="item.industryCode"
        :value="item.industryCode"
        :label="item.industryName"
      />
    </el-select>
  </el-form-item>
  <el-form-item label="企业联系人" prop="contact">
    <el-input v-model="addForm.contact" />
  </el-form-item>
  <el-form-item label="联系电话" prop="contactNumber">
    <el-input v-model="addForm.contactNumber" />
  </el-form-item>
  <el-form-item label="营业执照" prop="businessLicenseId">
    <el-upload
      action="#"
      :http-request="uploadRequest"
      :before-upload="beforeUpload"
    >
      <el-button size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">支持扩展名:.png .jpg .jpeg,文件大小不得超过5M</div>
    </el-upload>
  </el-form-item>
</el-form>

 

统一校验

<el-form ref="ruleForm"></el-form>

<el-button type="primary" @click="confirmSubmit">确定</el-button>

confirmSubmit() {
  this.$refs.ruleForm.validate(valid => {
    console.log(valid)
  })
}

 

正则校验手机号

const validatePhone = (rule, value, callback) => {
  if (/^1[3-9]\d{9}$/.test(value)) {
    callback()
  } else {
    callback(new Error('请输入正常的手机号'))
  }
}

contactNumber: [
    { required: true, message: '企业联系人电话为必填', trigger: 'blur' },
    { validator: validatePhone, trigger: 'blur' }
]

 

上传完毕单独校验营业执照字段

async uploadRequest(data) {
    // 上传逻辑...
     
    // 单独校验表单,清除错误信息
    this.$refs.ruleForm.validateField('businessLicenseId')
}

 

提交表单

封装新增接口
export function createExterpriseAPI(data) {
  return request({
    url: '/park/enterprise',
    method: 'POST',
    data
  })
}
点击提交
confirmSubmit() {
  this.$refs.ruleForm.validate(async valid => {
    if (!valid) return
    // 1. 调用接口
    await createExterpriseAPI(this.addForm)
    // 2. 返回列表页
    this.$router.back()
  })
}

编辑企业

携带参数跳转编辑页

<el-button 
  size="mini" 
  type="text" 
  @click="editRent(scope.row.id)"
  >编辑</el-button>
  
editRent(id) {
  this.$router.push({
    path: '/exterpriseAdd',
    query: {
      id
    }
  })
}

 

根据id适配文案显示

<el-page-header 
  :content="`${id?'编辑企业':'添加企业'}`" 
  @back="$router.back()" />


computed: {
  id() {
    return this.$route.query.id
  }
}

 

回填企业数据

封装接口

export function getEnterpriseDetailAPI(id) {
  return request({
    url: `/park/enterprise/${id}`
  })
}

调用接口回填数据

async getEnterpriseDetail() {
  const res = await getEnterpriseDetailAPI(this.rentId)
  const { businessLicenseId, businessLicenseUrl, contact, contactNumber, industryCode, legalPerson, name, registeredAddress } = res.data
  this.addForm = { businessLicenseId, businessLicenseUrl, contact, contactNumber, industryCode, legalPerson, name, registeredAddress }
}

mounted() {
  // 省略代码 有合同id 调用详情接口
  if (this.Id) {
    this.getEnterpriseDetail()
  }
}

 

编辑确认修改

封装编辑更新接口

export function updateExterpriseAPI(data) {
  return request({
    url: '/park/enterprise',
    method: 'PUT',
    data
  })
}

区分状态接口提交

confirmSubmit() {
  this.$refs.ruleForm.validate(async valid => {
    console.log(valid)
    if (this.id) {
      // 编辑
      await updateExterpriseAPI({
        ...this.addForm,
        id: this.Id
      })
    } else {
      // 新增
      await createExterpriseAPI(this.addForm)
    }
    this.$router.back()
  })
}

删除功能实现

封装接口函数

export function delExterpriseAPI(id) {
  return request({
    url: `/park/enterprise/${id}`,
    method: 'DELETE'
  })
}

绑定事件执行删除

<el-table-column label="操作">
  <template #default="scope">
    <el-button size="mini" type="text">添加合同</el-button>
    <el-button size="mini" type="text">查看</el-button>
    <el-button size="mini" type="text">编辑</el-button>
    <el-button size="mini" type="text" @click="delExterprise(scope.row.id)">删除</el-button>
  </template>
</el-table-column>

delExterprise(id) {
  this.$confirm('确认删除该企业吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(async() => {
    await delExterpriseAPI(id)
    this.getExterpriseList()
    this.$message({
      type: 'success',
      message: '删除成功!'
    })
  })
}

创建合同

控制弹框打开关闭

<el-button size="mini" type="text" @click="addRent()">添加合同</el-button>


<el-dialog
  title="添加合同"
  :visible="rentDialogVisible"
  width="580px"
  @close="closeDialog"
  >
  <!-- 表单区域 -->
  <div class="form-container">

  </div>
  <template #footer>
    <el-button size="mini" @click="closeDialog">取 消</el-button>
    <el-button size="mini" type="primary">确 定</el-button>
  </template>
</el-dialog>


data(){
  return {
    rentDialogVisible:false
  }
}

methods:{
  // 打开
  addRent(){
    this.rentDialogVisible = true
  },
  // 关闭
  closeDialog(){
    this.rentDialogVisible = false
  }
}

获取楼宇下拉框数据

封装获取楼宇列表接口

export function getRentBuildListAPI() {
  return request({
    url: '/park/rent/building'
  })
}

打开弹框时调用接口

import { getRentBuildListAPI } from '@/apis/enterprise'


// 打开弹框
async addRent(enterpriseId) {
  this.rentDialogVisible = true
  // 获取楼宇下拉列表
  const res = await getRentBuildListAPI()
  this.buildList = res.data
}

渲染下拉列表视图模版

<el-form-item label="租赁楼宇" prop="buildingId">
  <el-select v-model="rentForm.buildingId" placeholder="请选择">
    <el-option
      v-for="item in buildList"
      :key="item.id"
      :label="item.name"
      :value="item.id"
    />
  </el-select>
</el-form-item>

 

上传合同文件

<el-form-item label="租赁合同" prop="contractId">
  <el-upload
    action="#"
    :http-request="uploadHandle"
  >
    <el-button size="small" type="primary" plain>上传合同文件</el-button>
    <div slot="tip" class="el-upload__tip">支持扩展名:.doc .docx .pdf, 文件大小不超过5M</div>
  </el-upload>
</el-form-item


// 上传合同
async uploadHandle(fileData) {
  // 1. 处理FormData
  const { file } = fileData
  const formData = new FormData()
  formData.append('file', file)
  formData.append('type', 'contract')
  // 2. 上传并赋值
  const res = await uploadAPI(formData)
  const { id, url } = res.data
  this.rentForm.contractId = id
  this.rentForm.contractUrl = url
  // 单独校验表单
this.$refs.addForm.validate('contractId')
  
}

 

提交表单创建合同

封装接口

export function createRentAPI(data) {
  return request({
    url: '/park/enterprise/rent',
    method: 'POST',
    data
  })
}

补充企业id参数

<el-button size="mini" type="text" @click="addRent(row.id)">添加合同</el-button>
  
// 添加合同
addRent(id) {
  this.dialogVisible = true
  // 把企业id存入表单对象
  this.rentForm.enterpriseId = id
}

处理参数提交表单

// 确认提交
confirmAdd() {
  this.$refs.addForm.validate(async valid => {
    if (valid) {
      const { buildingId, contractId, contractUrl, enterpriseId, type } = this.rentForm
      await createRentAPI({
        buildingId, contractId, contractUrl, enterpriseId, type,
        startTime: this.rentForm.rentTime[0],
        endTime: this.rentForm.rentTime[1]
      })
      // 更新列表
      this.getExterpriseList()
      // 关闭弹框
      this.rentDialogVisible = false
    }
  })
}

显示合同列表

获取当前合同列表

封装接口函数

export function getRentListAPI(id) {
  return request({
    url: `/park/enterprise/rent/${id}`
  })
}

展开时获取合同数据

/ 1. 绑定事件 & 绑定数据
<el-table style="width: 100%" :data="exterpriseList" 
  @expand-change="expandHandle">

<el-table-column type="expand">
  <template #default="{row}">
    <el-table :data="row.rentList">
      <el-table-column label="租赁楼宇" width="320" prop="buildingName" />
      <el-table-column label="租赁起始时间" prop="startTime" />
      <el-table-column label="合同状态" prop="status" />
      <el-table-column label="操作" width="180">
        <template #default="scope">
          <el-button size="mini" type="text">续租</el-button>
          <el-button size="mini" type="text">退租</el-button>
          <el-button size="mini" type="text">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
  </template>
</el-table-column>


// 2. 初始化时增加合同数据默认列表   
async getExterpriseList() {
  const res = await getEnterpriseListAPI(this.params)
  this.exterpriseList = res.data.rows.map((item) => {
    return {
      ...item,
      rentList: [] // 每一行补充存放合同的列表
    }
  })
  this.total = res.data.total
}
    

// 3. 只有展开时获取数据并绑定
async expandHandle(row, rows) {
  console.log('展开或关闭', row, rows)
  const isExpend = rows.find(item => item.id === row.id)
  if (isExpend) {
    const res = await getRentListAPI(row.id)
    // eslint-disable-next-line require-atomic-updates
    row.rentList = res.data
  }
}

 

适配合同状态

// 格式化tag类型
formatInfoType(status) {
  const MAP = {
    0: 'warning',
    1: 'success',
    2: 'info',
    3: 'danger'
  }
  // return 格式化之后的中文显示
  return MAP[status]
}

// 格式化status
formartStatus(type) {
  const TYPEMAP = {
    0: '待生效',
    1: '生效中',
    2: '已到期',
    3: '已退租'
  }
  return TYPEMAP[type]
}

<el-table-column label="合同状态">
  <template #default="scope">
    <el-tag :type="formatInfoType(scope.row.status)"> 
      {{ formatStatus(scope.row.status) }}
    </el-tag>
  </template>
</el-table-column>

合同退租状态修改

封装接口

export function outRentAPI(rentId) {
  return request({
    url: `/park/enterprise/rent/${rentId}`,
    method: 'PUT'
  })
}

修改状态

<el-table-column label="操作" width="180" fixed="right">
  <template #default="scope">
    <el-button size="mini" type="text" @click="outRent(scope.row.id)">退租</el-button>
    <el-button size="mini" type="text" >删除</el-button>
  </template>
</el-table-column>


outRent(rentId) {
  this.$confirm('确认退租吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(async() => {
    // 1. 调用接口
    await outRentAPI(rentId)
    // 2. 重新拉取列表
    this.getEnterpriseListAPI()
    this.$message({
      type: 'success',
      message: '退租成功!'
    })
  }).catch(() => {
    this.$message({
      type: 'info',
      message: '已取消删除'
    })
  })
}

适配视图状态

<el-table-column label="操作" width="180" fixed="right">
  <template #default="scope">
    <el-button size="mini" type="text" :disabled="scope.row.status === 3" @click="outRent(scope.row.id)">退租</el-button>
    <el-button size="mini" type="text" :disabled="scope.row.status !== 3">删除</el-button>
  </template>
</el-table-column>

查看企业

准备路由

{
    path: '/exterpriseDetail',
    component: () => import('@/views/park/enterprise/Detail')
}

渲染列表

封装接口

export function getEnterpriseDetail(id) {
  return request({
    url: `/park/enterprise/${id}`,
    method: 'GET'
  })
}

渲染数据

<script>
import { getEnterpriseDetail } from '@/apis/enterprise'
export default {
  data() {
    return {
      form: {}
    }
  },
  mounted() {
    this.getDetail()
  },
  methods: {
    async getDetail() {
      const res = await getEnterpriseDetail(this.$route.query.id)
      this.form = res.data
    }
  }
}
</script>

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

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

相关文章

《CUDA编程》3.简单CUDA程序的基本框架

本章将学习CUDA程序的基本框架&#xff0c;编写更加有用的CUDA程序 0 C例子&#xff1a;数组相加 C代码如下&#xff1a; #include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> // 包含 time.h 头文件以使用 clock()const d…

Tesla T4 P2P测试

Tesla T4 P2P测试 一.测试环境二.测试步骤1.获取设备信息2.查看PCIE拓扑结构3.选择9B、9E这二张4.查看逻辑设备ID5.设置环境变量(需要用逻辑设备ID,通过UUID跟smi看到的物理ID关联)6.不同地址的原子操作2.P2P与非P2P的性能差异3.GPU带宽测试 Tesla T4 P2P测试 通过物理ID找到逻…

一场大模型面试,三个小时,被撞飞了

去华为面试大模型&#xff0c;一点半去五点半回&#xff0c;已经毫无力气。 1️⃣一轮面试—1小时 因为一面都是各个业务的主管&#xff0c;所以专业性很强&#xff0c;面试官经验很丰富&#xff0c;建议大家还是需要十分熟悉所学内容&#xff0c;我勉强通过一面。 2️⃣二轮…

9_24_statusBar

statusBar&#xff08;状态栏&#xff09; 状态栏就是一个窗口最先面的一行&#xff0c;一般有三个作用&#xff1a; • 永久信息&#xff0c;例如版本号&#xff0c;机构名称 • 进度消息&#xff0c;如进度条提示&#xff0c;百分比提示 • 实时消息&#xff0c;当前程序状态…

神经网络的初步学习

文章目录 概要基础概念简单的神经网络图神经元模型权重求和激活函数输出 多层感知机前向传播&#xff1a;激活函数&#xff1a;误差计算&#xff08;损失函数&#xff09;&#xff1a;反向传播&#xff1a;1. **激活函数&#xff08;Activation Function&#xff09;**2. **非线…

mini-lsm通关笔记Week2Overview

Week 2 Overview: Compaction and Persistence 在上周&#xff0c;您已经实现了LSM存储引擎的所有必要结构&#xff0c;并且您的存储引擎已经支持读写接口。在本周中&#xff0c;我们将深入探讨SST文件的磁盘组织&#xff0c;并研究在系统中实现性能和成本效益的最佳方法。我们…

Skyeye 云这几年的经历

前言 我是 17 年毕业的&#xff0c;之前也是在学校的实验室 (做开发的) 待了两年多时间&#xff0c;期间学了不少东西&#xff0c;学的东西也算是与时俱进了。最近两年也算是开源中国的常客了&#xff0c;每周都会保持自己项目的一个更新进度。 项目地址&#xff1a;skyeye-o…

【SpringCloud】优雅实现远程调用 - OpenFeign

目录 优雅实现远程调用-OpenFeignRestTemplate存在问题OpenFeign介绍Spring Cloud Feign 快速上手引入依赖添加注解编写OpenFeign的客户端远程调用测试 OpenFeign参数传递传递单个参数传递多个参数传递对象传递JSON 最佳实践Feign 继承方式创建⼀个Module引入依赖编写接口打Jar…

ESP32,制作一个遥控点火玩具

最近想做一个遥控点火玩具&#xff0c;过年的时候可以让娃拿出手机遥控点炮&#xff0c;绝对能成为全村最亮的仔。 实际也挺简单&#xff0c;使用的东西有ESP32开发板&#xff0c;1838T红外接收器&#xff0c;一个继电器&#xff0c;一个钨丝。 原理图如下。 GPIO17接红外ou…

夹耳式蓝牙耳机哪个牌子最好?夹耳式耳机推荐性价比排行榜

耳夹式耳机既不堵耳孔、也不需要包覆耳廓&#xff0c;佩戴时看起来更像是一个“耳环”&#xff0c;固定方式也类似“夹耳朵”。不过&#xff0c;它并不是真的夹住了耳朵肉&#xff0c;而是半夹、半挂——依靠耳廓边缘厚、里面薄&#xff0c;且有一定的弯折面的特殊构造&#xf…

Arm Cortex-R52+ Generic Timer分析

目录 1.Generic Timer初识 2.R52的Generic Timer 3.如何配置Timer中断 4.小结 1.Generic Timer初识 Arm Cortex-R52内部实现了Generic Timer(通用计时器)&#xff0c;它可以基于递增计数来产生中断和事件流。 事实上&#xff0c;该计时器和Armv8-R AArch32中的定义完全一…

Python数据分析与可视化:从基础到高级应用

一、引言 在当今数据驱动的时代&#xff0c;数据的分析和可视化变得至关重要。Python作为一种功能强大且广泛使用的编程语言&#xff0c;在数据分析和可视化领域拥有丰富的库和工具。通过Python&#xff0c;数据分析师和科学家能够高效地处理数据、提取有价值的信息并以直观的方…

【网络安全】更改参数实现试用计划延长

未经许可,不得转载。 文章目录 正文目标:example.com,电子商务网站,允许企业在线创建商店。该平台提供了广泛的功能,如商店设计、创建产品等。 正文 在界面 example.com/start-your-trial/ 上,可以创建为期 15 天的试用商店。填写完所有信息后,我点击了“Sign Up”按钮…

BERT训练环节(代码实现)

1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…

一带一路区块链赛项样题解析(中)

一带一路区块链赛项样题解析 (模块二) 标题任务一 按要求完成智能合约开发 1、学籍信息合约(Roll)接口编码(6分) (1)编写学籍信息合约中的RollInfo 实体接口,完成RollInfo实体通用数据的初始化,实现可追溯的学籍信息上链功能;(2分) // SPDX-License-Identifie…

FPGA IP 和 开源 HDL 一般去哪找?

在FPGA开发的世界中&#xff0c;IP核和HDL模块是构建复杂数字系统的基石。它们如同乐高积木&#xff0c;让开发者能够快速搭建和重用经过验证的电路功能。但你是否曾感到迷茫&#xff0c;不知道从哪里寻找这些宝贵的资源&#xff1f;本文将为你揭开寻找FPGA IP核和HDL模块资源的…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT&#xff1a;AI界的新宠儿1. 背景介绍2. MemGPT是什么&#xff1f;3. 如何安装MemGPT&#xff1f;4. 简单的库函数使用方法5. 场景应用场景一&#xff1a;创建持久聊天机器人场景二&#xff1a;文档分析场景三&#xff1a;多会话聊天互动 6. 常见Bug及解决方…

【2.使用VBA自动填充Excel工作表】

目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程&#xff08;功能&#xff09;定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码&#xff0c;对应A公司工作表Us…

社区来稿丨一个真正意义上的实时多模态智能体框架,TEN Framework 为构建下一代 AI Agent 而生

本文由 RTE 开发者社区成员通过社区网站投稿提供&#xff0c;如果你也有与实时互动&#xff08;Real-Time Engagement&#xff0c;RTE&#xff09;相关的项目分享&#xff0c;欢迎访问网站 rtecommunity.dev 发布&#xff0c;优秀项目将会在公众号发布分享。 自从 OpenAI 展示了…

大数据毕业设计选题推荐-手机销售数据分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…