day06 项目实践:router,axios

news2024/12/27 9:49:53

vue组件的生命周期钩子

今天几乎没有讲什么新内容,就是一起做项目,只有一个小小的知识点,就是关于vue组件的生命周期钩子,其中最重要的四个函数——

beforeCreate():组件创建之间执行
created():组件创建之后立即执行
beforeMount():组件渲染前执行
mounted():组件渲染完毕之后立即执行

项目

最终实现页面——

ec6906a4cc1240d2b33b8c4426a2f00e.png

d363abe130ee4d548c1fb32699f0f856.png 

BankView.vue中负责前端页面显示和调用配置的请求函数——

发现表格的column里面可以嵌套template,template可以配置slot-scope,来指代当前表格,可以用scope.row的方式得到当前行的记录,以便获得记录的任何信息;

尝试了根据表格内容修改column的type,但是最终只是列了下拉表格中包含几个元素,不知道怎样获得当前记录所包含的数组有多少,而且后端查询的时候,如果是findById就查不到BankUser的内容,也就是bankUserList是null的,尝试过设一个计算属性来设置type,但是失败了,导致每一个下拉表格都打不开了

<template>
  <div>
    <h1>Bank View</h1>
    <el-button @click="find" type="primary">search</el-button>
    <el-button @click="add" type="primary">add</el-button>
    <br /><br /><br />
    <el-input v-model="inputValue" placeholder="请输入id"></el-input>
    <br /><br />
    <el-table :data="bankList" style="width: 100%">
      <el-table-column type="expand">
        <template slot-scope="props">
          <el-table :data="props.row.bankUserList" style="width: 100%">
            <el-table-column label="userName" prop="userName">
            </el-table-column>
            <el-table-column label="role" prop="role"> </el-table-column>
            <el-table-column label="realName" prop="realName">
            </el-table-column>
            <el-table-column label="password" prop="password">
            </el-table-column>
            <el-table-column label="phone" prop="phone"> </el-table-column>
            <el-table-column label="createTime" prop="createTime">
            </el-table-column>
            <el-table-column label="updateTime" prop="updateTime">
            </el-table-column>
          </el-table>
        </template>
      </el-table-column>
      <el-table-column label="UserNum"  width="180">
        <template slot-scope="props">
        {{ props.row.bankUserList != null ? props.row.bankUserList.length : 0 }}
        </template>
      </el-table-column>
      <el-table-column label="bankId" prop="bankId" width="180">
      </el-table-column>
      <el-table-column label="bankName" prop="bankName" width="180">
      </el-table-column>
      <el-table-column label="bankPhone" prop="bankPhone" width="180">
      </el-table-column>
      <el-table-column label="introduce" prop="introduce" width="300">
      </el-table-column>
      <el-table-column label="money" prop="money" width="180">
      </el-table-column>
      <el-table-column label="rate" prop="rate" width="180"> </el-table-column>
      <el-table-column label="repayment" prop="repayment" width="180">
      </el-table-column>
      <!--  -->
      <el-table-column fixed="right" label="操作" width="100">
        <template slot-scope="scope">
          <el-button
            @click="deleteBank(scope.row.bankId)"
            type="text"
            size="small"
            >删除</el-button
          >
          <el-button
            type="text"
            size="small"
            @click="updateBank(scope.row.bankId)"
            >编辑</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <!--  添加的对话框-->
    <el-dialog :title="title" :visible.sync="dialogFormVisible">
      <el-form :model="form" :rules="rules" ref="bankForm">
        <el-form-item
          label="bankName"
          :label-width="formLabelWidth"
          prop="bankName"
        >
          <el-input v-model="form.bankName" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item
          label="bankPhone"
          :label-width="formLabelWidth"
          prop="bankPhone"
        >
          <el-input v-model="form.bankPhone" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item
          label="introduce"
          :label-width="formLabelWidth"
          prop="introduce"
        >
          <el-input v-model="form.introduce" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="money" :label-width="formLabelWidth" prop="money">
          <el-input v-model="form.money" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="rate" :label-width="formLabelWidth" prop="rate">
          <el-input v-model="form.rate" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item
          label="repayment"
          :label-width="formLabelWidth"
          prop="repayment"
        >
          <el-input v-model="form.repayment" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="cancel">取 消</el-button>
        <el-button type="primary" @click="save">保 存</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import bankApi from "../api/bank";

export default {
  name: "BankView",
  created() {
    this.findAndBankUser();
  },
  data() {
    return {
      bankList: [],
      bank: {},
      inputValue: "",
      dialogFormVisible: false, // 控制添加的对话框是否可见
      title: "",
      formLabelWidth: "100px",
      form: {
        bankName: "",
        bankPhone: "",
        introduce: "",
        money: "",
        rate: "",
        repayment: "",
      },
      rules: {
        bankName: [
          { required: true, message: "请输入银行名称", trigger: "blur" },
          {
            min: 2,
            max: 50,
            message: "长度在 2 到 50 个字符",
            trigger: "blur",
          },
        ],
        bankPhone: [
          { required: true, message: "请输入银行电话", trigger: "blur" },
          { min: 11, max: 11, message: "长度为11位", trigger: "blur" },
        ],
        introduce: [
          { required: true, message: "请输入银行介绍", trigger: "blur" },
          {
            min: 2,
            max: 200,
            message: "长度在 2 到 200 个字符",
            trigger: "blur",
          },
        ],
        money: [
          { required: true, message: "请输入银行存款金额", trigger: "blur" },
        ],
        rate: [{ required: true, message: "请输入银行利率", trigger: "blur" }],
        repayment: [
          { required: true, message: "请输入银行还款期限", trigger: "blur" },
        ],
      },
    };
  },
  computed:{
    expandMethod(row){
        if(row.bankUserList != null && row.bankUserList.length > 0){
            row.type = "expand";
        }else{
            row.type = "default";
        }
        return row.type;
    }
  },
  methods: {
    updateBank(id) {
      this.title = "编辑银行";
      this.dialogFormVisible = true;
      bankApi.findById(id).then((res) => {
        if (res.data.code == 200) {
          if (res.data.data == null) {
            this.infoMessage("数据库错误,请联系管理员");
          } else {
            this.form = res.data.data;
          }
        } else {
          this.errorMessage(res.data.message);
        }
      });
    },
    deleteBank(id) {
      this.$confirm("确定要删除编号为" + id + "的数据吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          bankApi.deleteBank(id).then((res) => {
            if (res.data.code == 200) {
              this.successMessage("删除了" + res.data.data + "条数据");
              this.findAndBankUser();
            } else {
              this.errorMessage(res.data.message);
            }
          });
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消删除",
          });
        });
    },
    save() {
      // 验证表单
      this.$refs.bankForm.validate((validate) => {
        if (validate) {
          // 验证通过,可以提交数据
          if (this.form.bankId == null || this.form.bankId == 0) {
            bankApi.saveBank(this.form).then((res) => {
              if (res.data.code == 200) {
                this.successMessage("添加了" + res.data.data + "条数据");
                // this.successMessage();
                this.findAndBankUser();
              } else {
                this.errorMessage(res.data.message);
              }
            });
          } else {
            bankApi.updateBank(this.form).then((res) => {
              if (res.data.code == 200) {
                this.successMessage("修改了" + res.data.data + "条数据");
                this.findAndBankUser();
              } else {
                this.errorMessage(res.data.message);
              }
            });
          }

          this.dialogFormVisible = false;
          this.$refs.bankForm.resetFields(); //重置表单
        }
      });
    },
    cancel() {
      this.dialogFormVisible = false;
      this.$refs.bankForm.resetFields(); //重置表单
    },
    add() {
      this.title = "添加银行";
      this.dialogFormVisible = true;
      this.$refs.bankForm.resetFields(); //重置表单
    },
    find() {
      if (this.inputValue) {
        // alert(this.inputValue);
        this.findById();
      } else {
        this.findAndBankUser();
      }
    },
    findById() {
      bankApi.findById(parseInt(this.inputValue, 10)).then((res) => {
        // alert(parseInt(this.inputValue, 10));
        if (res.data.code == 200) {
            this.bank = res.data.data;
          if (this.bank != null) {
            
            this.$set(this, "bankList", []); // 清空原有数据
            this.bankList.push(this.bank);
          } else {
            this.infoMessage("没有找到该银行");
          }
        } else {
          this.errorMessage(res.data.message);
        }
      });
    },
    findAndBankUser() {
      bankApi.findAndBankUser().then((res) => {
        if (res.data.code == 200) {
          this.bankList = res.data.data;
        }
      });
    },
    successMessage(message) {
      this.$message({
        message: message,
        type: "success",
      });
    },
    infoMessage(message) {
      this.$message({
        message: message,
        type: "warning",
      });
    },
    errorMessage(message) {
      this.$message.error(message);
    },
  },
};
</script>

bank.js中创建请求函数——

要注意有四种请求方式:

get(查找,需要后端@RequestParam,或使用@PathVariable,前端传参params)、
post(添加,后端需要@RequestBody,前端传参data)、
put(修改,后端需要@RequestBody,前端传参data)、
delete(删除,需要后端@RequestParam,或使用@PathVariable,前端传参params)

还有注意参数名要前后端对应!!!不然就执行不了

import request from '../utils/request';

export default{findById,findAndBankUser,saveBank,deleteBank,updateBank}
function findById(id) {
    return request({
        url:'/bank/findById',
        method:'get',
        params:{bankId:id}
    })
}
function findAndBankUser(){
    return request({
        url:'bank/findAndBankUser',
        method:'get'
    })
}
function saveBank(bank){
    return request({
        url:'bank/save',
        method:'post',
        data:bank
    })
}
function deleteBank(id){
    return request({
        url:'bank/delete',
        method:'delete',
        params:{bankId:id}
    })
}
function updateBank(bank){
    return request({
        url:'bank/update',
        method:'put',
        data:bank
    })
}

 

 

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

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

相关文章

05。拿捏ArkTS 第 3 天 --- 对象、联合类型、枚举

1&#xff0c;什么是对象&#xff1f;对象是干什么的&#xff1f; &#xff5e;用来存储不同类型数据的容器 &#xff5e;用来描述物体的特征和行为 //特征就是属性&#xff0c;行为就是方法&#xff08;对象内的函数&#xff09; 2&#xff0c;对象的基本样式是&#xff1f; …

LangChain4j-RAG高级-核心概念

RetrievalAugmentor整体概念 简单总结一下 LangChain4j中对于RetrievalAugmentor这里官方描述的比较模糊, 只在 DefaultRetrievalAugmentor章节给出来了一个灵感来源的文章(LangChain框架中的设计思路)和一个研究报告, 有兴趣可以看一下: Deconstructing RAGhttps://arxiv.o…

Greenplum的诞生与成长过程

Greenplum 成立与早期发展 Greenplum的诞生于早起发展 Greenplum于2003年在美国硅谷成立&#xff0c;在2006年发布了基于PostgreSQL(8.x)的MPP数据库产品&#xff0c;作为与公司同名的MPP数据库&#xff0c;专为分析和管理海量数据集而设计&#xff0c;支持复杂的数据分析和商…

0724,select +tcp 聊天室喵

目录 TCP协议喵 723__01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 001: 002: TIMEWAI OR BUG 721作业&#xff1a; 01&#xff1a;在一对一聊天的基础上&#xff0c;使用select实现一对多的回显服务。&#xff08;回显服务即接收到客户端发送的数…

布尔盲注——多种方式实现及利用burpsuite爆破

目录 1、判断闭合符类型 2、爆数据库长度 3、查询库名 手动注入 burpsuite爆破 方法一&#xff1a;用ASCII码值转化爆破 方法二&#xff1a;left方法直接爆破字母 方法三&#xff1a;if方法爆破注入&#xff08;最简单&#xff09; 4、爆破表名 5、爆破具体值 当我们改变前端…

javaEE(1)

一. Web开发概述 Web开发:指的是从网页中向后端程序发送请求,与后端程序进行交互 Web服务器:是一种软件,向浏览器等Web客户端提供文档等数据,实现数据共享,它是一个容器,是一个连接用户和程序之间的中间键 二. Web开发环境搭建 我们要实现前后端交互,首先需要中间键Web服务…

pinia安装及简介

pinia简介 基本特点 轻量级&#xff1a;Pinia相比于传统的Vuex&#xff0c;体积更小&#xff0c;性能更好&#xff0c;只有大约1KB左右。 简化API&#xff1a;Pinia简化了状态管理库的使用方法&#xff0c;抛弃了Vuex中的mutations&#xff0c;只保留了state、getters和actions…

论文阅读:(DETR)End-to-End Object Detection with Transformers

论文阅读&#xff1a;&#xff08;DETR&#xff09;End-to-End Object Detection with Transformers 参考解读&#xff1a; 论文翻译&#xff1a;End-to-End Object Detection with Transformers&#xff08;DETR&#xff09;[已完结] - 怪盗kid的文章 - 知乎 指示函数&…

传输层(port)UDP/TCP——解决怎么发,发多少,出错了怎么办

**传输层&#xff1a;**负责数据能够从发送端传输接收端. 传输层所封装的报头里一定有&#xff1a;源端口号和目的端口号的。 **端口号&#xff1a;**可以标识一台主机中的唯一一个进程&#xff08;运用程序&#xff09;&#xff0c;这样当数据传输到传输层的时候就可以通过端…

电商项目之如何判断线程池是否执行完所有任务

文章目录 1 问题背景2 前言3 4种常用的方法4 代码4.1 isTerminated()4.2 线程池的任务总数是否等于已执行的任务数4.3 CountDownLatch计数器4.4 CyclicBarrier计数器 1 问题背景 真实生产环境的电商项目&#xff0c;常使用线程池应用于执行大批量操作达到高性能的效果。应用场景…

当全球银行系统“崩溃”时会发生什么?

有句名言&#xff1a;“当美国打喷嚏时&#xff0c;世界就会感冒……”换句话说&#xff0c;当人们对美国及其经济稳定性的信心下降时&#xff0c;其他经济体&#xff08;以及黄金、白银和股票等资产&#xff09;的价值往往会下降。 与任何其他资产类别一样&#xff0c;加密货…

Java并发编程深入浅出(个人造诣)

目录 串行&#xff0c;并行与并发&#xff1a; 并发编程的目的 如何保证多线程的安全&#xff08;并发编程思想&#xff09; 写后读思想&#xff1a;&#xff08;一个线程写后再让另一个线程读&#xff09; 如何保障写后读&#xff1f; 1、加锁&#xff1a;&#xff08;s…

Cocos Creator2D游戏开发(3)-飞机大战(1)-背景动起来

资源见: https://pan.baidu.com/s/1cryYNdBOry5A4YEEcLwhDQ?pwdzual 步骤 1, 让背景动起来 2, 玩家飞机显现,能操控,能发射子弹 3.敌机出现 4. 碰撞效果(子弹和敌机,敌机和玩家) 5. 积分和游戏结束 6. 游戏存档,对接微信小游戏,保存历史最高分 7. cocos发布到微信小游戏 资源…

【计算机网络】IP地址和子网掩码(IP地址篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️计算机网络】 文章目录 前言IP地址网络地址网络地址的定义与组成作用分类网络地址的分配与管理 广播地址&#xff08;Broadcast Address&#xff09;定义构成类型作用注意事项 广播地址功能 组播地址…

【初阶数据结构篇】栈的实现(赋源码)

文章目录 栈1 代码位置2 概念与结构1.1概念1.2结构 2 栈的实现2.1 栈的初始化和销毁2.1.1 初始化2.1.2 销毁 2.2 栈顶插入和删除数据2.2.1 栈顶插入数据&#xff08;压栈&#xff09;2.2.2 栈顶删除数据&#xff08;出栈&#xff09; 2.3 返回栈顶数据2.4 返回栈的有效数据个数…

Jenkins持续部署

开发环境任务的代码只要有更新&#xff0c;Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee&#xff0c;点击添加账户&#xff0c;并将自己的账户添…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p …

【QGroundControl二次开发】六. QGC地面站中视频流配置gstreamer

本文解决qgc源码编译后无法接收视频推流&#xff0c;原因是缺少gstreamer。 下面为windows安装流程&#xff0c;qgc版本为4.4.1稳定版 1. 安装gstreamer 官网链接&#xff1a;https://gstreamer.freedesktop.org/download/#windows 两个都要下载。安装的时候&#xff0c;在cu…

网络安全自学从入门到精通的制胜攻略!!!

在信息时代&#xff0c;网络安全已成为至关重要的领域。越来越多的人希望通过自学掌握这门技术&#xff0c;开启充满挑战与机遇的职业道路。以下是一份精心为您打造的网络安全自学攻略&#xff0c;助您在自学之旅中乘风破浪。 一、明确目标与兴趣方向 网络安全涵盖众多领域&am…

Java的四种引用类型

Java的四种引用类型 1. 强引用&#xff08;Strong Reference&#xff09;2. 软引用&#xff08;Soft Reference&#xff09;3. 弱引用&#xff08;Weak Reference&#xff09;4. 虚引用&#xff08;Phantom Reference&#xff09; &#x1f496;The Begin&#x1f496;点点关注…