【信贷后台管理之(五)】

news2024/11/25 12:59:03

文章目录

  • 目录结构
  • 一、面包屑组件封装
  • 二、退出登录接口联调
  • 三、申请列表的菜单路由
    • 3.1 路由创建,表格编写
    • 3.2 列表接口调用
    • 3.3 出生日期转变
    • 3.4 申请状态
    • 3.5 申请列表的操作
      • 3.5.1 编辑删除提交操作
      • 3.5.2 禁用状态
      • 3.5.3 操作接口
      • 3.5.4 搜索查询
      • 3.5.5 申请列表分页功能
      • 3.5.6 申请列表编辑功能


目录结构

在这里插入图片描述

一、面包屑组件封装

在components下新建BreadCrumb.vue组件
自动获取列表面包屑,定义route放在computed自动获取属性里,定义matched接受当前资源路径,若是首页就返回内容,若不是则返回空。
BreadCrumb.vue代码如下:

<template>
  <div class="breadCrumb">
    <el-breadcrumb separator="/">
      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item><a href="/">
        {{route}}
      </a></el-breadcrumb-item>

    </el-breadcrumb>
  </div>
</template>

<script>
export default {
  computed:{
    route(){
      let matched = this.$route.matched;
      return matched[matched.length - 1].meta.title !== "首页"?matched[matched.length-1].meta.title:"";
    },
  },
};
</script>

<style></style>

在CommonHeader.vue引入使用
在这里插入图片描述
在这里插入图片描述

二、退出登录接口联调

在CommonHeader.vue里给退出登录按钮增加指令事件,点击退出登录后,控制台会打印logout。

在这里插入图片描述
与后端进行接口联调,在src—api—user.js文件,
在这里插入图片描述
在这里插入图片描述
实现退出登录后token消失
在这里插入图片描述
在这里插入图片描述
CommonHeader.vue代码如下

<template>
<div class="head-container">
<!--    左侧面包屑-->
    <div class="left" >
      <BreadCrumb />
    </div>
<!--    右侧用户名-->
    <div class="right">
<!--      下拉菜单-->
      <el-dropdown @command="logout">
        <span class="el-dropdown-link"> admin </span>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item command="logout">退出登录</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
</div>
</template>
<script>
import BreadCrumb from "@/components/BreadCrumb.vue";
import {logout} from "@/api/user";
export default {
  components:{BreadCrumb},
  methods:{
    async logout(commond){
      console.log(commond);
      if(commond === 'logout'){
        // 退出登录业务逻辑
        let res = await logout();
        // console.log(res);
        if(res.data.code === 603){
          // 以下两种方法用于token清除
          // localStorage.removeItem("token");
          localStorage.clear();
        }

      }

    }
  }

}
</script>
<style>
.head-container{
  margin-left: 10px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

a:link{
  text-decoration: none;
  color: #ffffff;
}

//状态二:已经访问过的链接
a:visited{
  text-decoration: none;
  color: #ffffff;
}

// 状态三:鼠标滑过的链接(默认红色)
a:hover{
  text-decoration: none;
  color:#ffffff;
}
// 状态四:被点击的链接
a:active{
  text-display: none;
  color: #ffffff;
}
.el-header{
  display: flex;
  align-items: center;
  color: #ffffff;
  justify-content: space-between;
}

.el-footer{
  background-color: #b3c0d1;
  color: #333;
  text-align: center;
  line-height: 60px;
}
.el-aside{
  background-color: #545c64;
  color: #333333;
  text-align: center;
  line-height: 200px;
}
.el-main{
  background-color: #e9eef3;
  color: #333333;
  text-align: center;
}
.el-container{
  height: 100vh;
}
.el-menu-vertical-demo{
  border:none;
}

</style>

在这里插入图片描述

三、申请列表的菜单路由

3.1 路由创建,表格编写

src—views下添加路由组件,先新建application-manage,该文件下新建IndexView.vue。容器里上面放一行两列的layout布局,下面放table

<template>
  <div>
    <el-row>
      <el-col :span="22">
        <el-input type="text" placeholder="请输入名称" v-model="query"></el-input>
      </el-col>
      <el-col :span="2">
        <el-button type="primary" @click="queryName">搜索</el-button>
      </el-col>
    </el-row>
    <template>
      <el-table
          :data="tableData"
          stripe
          style="width: 100%">
        <el-table-column
            prop="date"
            label="日期"
            width="180">
        </el-table-column>
        <el-table-column
            prop="name"
            label="姓名"
            width="180">
        </el-table-column>
        <el-table-column
            prop="address"
            label="地址">
        </el-table-column>
      </el-table>
    </template>
  </div>
</template>

<script>
export default {
  data(){
    return{
      query:"", //名称
      // 表格数据
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  },
  methods:{
    queryName(){

    }
  }
}
</script>


<style>
.el-row{
  margin-bottom: 10px;
}
</style>

左侧导航栏的CommonAside.vue里添加申请管理二级导航
在这里插入图片描述

3.2 列表接口调用

api——loan.js

在这里插入图片描述

3.3 出生日期转变

在这里插入图片描述
application-manage下的IndexView.vue代码如下

<template>
  <div>
    <el-row>
      <el-col :span="22">
        <el-input type="text" placeholder="请输入名称" v-model="query"></el-input>
      </el-col>
      <el-col :span="2">
        <el-button type="primary" @click="queryName">搜索</el-button>
      </el-col>
    </el-row>
    <template>
      <el-table
          :data="tableData"
          stripe
          style="width: 100%">
        <el-table-column
            type="index"
            label="序号"
            width="70">
        </el-table-column>
        <el-table-column
            v-for="(item,index) in columns"
            :key="index"
            :label="item.label"
            :prop="item.prop"
            :width="item.width">
        </el-table-column>
      </el-table>
    </template>
  </div>
</template>

<script>
import {getLoanList} from "@/api/loan";

export default {
  data(){
    return{
      query:"", //名称
      // 表格数据
      tableData: [],
      columns: [
        {
          label: "姓名",
          prop: "name",
          width: "80",
        },
        {
          label: "出生日期",
          prop: "birthday",
          width: "220",
        },
        {
          label: "性别",
          prop: "sex",
        },
        {
          label: "教育程度",
          prop: "education",
        },
        {
          label: "居住地址",
          prop: "address1",
        },
        {
          label: "手机号",
          prop: "mobile_phone",
        },
        {
          label: "申请状态",
          prop: "status",
        },
        {
          label: "操作",
          width: "280",
          prop: "opts",
        },
      ],
    }
  },
  methods:{
    queryName(){},
    // 转化生日
    getBirthday(date){
      let dateNow = new Date(date);
      function convert(data){
        return data < 10 ?"0" +data:data;
      }
      let year = dateNow.getFullYear();
      let month = convert(dateNow.getMonth() + 1);
      let day = convert(dateNow.getDay()+1)

      let hours = convert(dateNow.getHours())
      let minutes = convert(dateNow.getMinutes())
      let secounds = convert(dateNow.getSeconds())
      let data = year + '-' +month + '-' + day +' '+hours+":"+minutes+":"+secounds;
      console.log(data);
      return data;
    },
    // 转换性别
    getSex(str){
      return str === 'man'?'男':'女';
    },
    // 转换教育程度
    getEducation(str){
      return str === 'college'?'大学':'高中'
    },
    async getLoanList(){
      let params = {
        pageNo : 1,
        pageSize:10,
      };
      let res = await getLoanList(params);
      this.tableData = res.data.data.data.data.map((item) =>{
        (item.birthday = this.getBirthday(item.birthday)),
        (item.sex = this.getSex(item.sex)),
        (item.education = this.getEducation(item.education));
        return item;
      });
      console.log(res.data.data.data.data);
    },
  },
  mounted() {
    this.getLoanList();
  }
}
</script>


<style>
.el-row{
  margin-bottom: 10px;
}
</style>

3.4 申请状态

添加过滤器和插槽

<template>
  <div>
    <el-row>
      <el-col :span="22">
        <el-input type="text" placeholder="请输入名称" v-model="query"></el-input>
      </el-col>
      <el-col :span="2">
        <el-button type="primary" @click="queryName">搜索</el-button>
      </el-col>
    </el-row>
    <template>
      <el-table
          :data="tableData"
          stripe
          style="width: 100%">
        <el-table-column
            type="index"
            label="序号"
            width="70" align="center">
        </el-table-column>
        <el-table-column
            v-for="(item,index) in columns"
            :key="index"
            :label="item.label"
            :prop="item.prop"
            :width="item.width"
            align="center">
<!--          column代表所有的列信息,row是当前行的信息-->
          <template v-slot="{column,row}">
            <div v-if="column.property === 'status'">
              <el-tag  :type="row[column.property] | statusColor">{{ row[column.property] | status }}</el-tag>
            </div>
            <div v-else>
              {{row[column.property]}}
            </div>
          </template>
        </el-table-column>
      </el-table>
    </template>
  </div>
</template>

<script>
import {getLoanList} from "@/api/loan";

export default {
  filters:{
    statusColor(status) {
      switch (status) {
        case 0:
          return 'success'
          break
        case 1:
          return ''
          break
        case 2:
          return 'success'
          break
        case 3:
          return 'danger'
          break
        case 4:
          return 'warning'
          break
        case 5:
          return 'success'
          break
        case 6:
          return 'danger'
          break
        case 7:
          return 'success'
          break
        default:
          return 'danger'

      }
    },
    status(status){
      switch (status) {
        case 0:
          return '进件'
          break
        case 1:
          return '提交初审'
          break
        case 2:
          return '初审通过'
          break
        case 3:
          return '初审拒绝'
          break
        case 4:
          return '提交终审'
          break
        case 5:
          return '终审通过'
          break
        case 6:
          return '终审拒绝'
          break
        case 7:
          return '生成合同'
          break
        default:
          return '出错了'
      }
    }
  },
  data(){
    return{
      query:"", //名称
      // 表格数据
      tableData: [],
      columns: [
        {
          label: "姓名",
          prop: "name",
          width: "80",
        },
        {
          label: "出生日期",
          prop: "birthday",
          width: "158",
        },
        {
          label: "性别",
          prop: "sex",
        },
        {
          label: "教育程度",
          prop: "education",
        },
        {
          label: "居住地址",
          prop: "address1",
        },
        {
          label: "手机号",
          prop: "mobile_phone",
        },
        {
          label: "申请状态",
          prop: "status",
        },
        {
          label: "操作",
          width: "280",
          prop: "opts",
        },
        {
          label: '配送信息',
          prop: 'address1',
        }
      ],
    }
  },
  methods:{
    queryName(){},
    // 转化生日
    getBirthday(date){
      let dateNow = new Date(date);
      function convert(data){
        return data < 10 ?"0" +data:data;
      }
      let year = dateNow.getFullYear();
      let month = convert(dateNow.getMonth() + 1);
      let day = convert(dateNow.getDay()+1)

      let hours = convert(dateNow.getHours())
      let minutes = convert(dateNow.getMinutes())
      let secounds = convert(dateNow.getSeconds())
      let data = year + '-' +month + '-' + day +' '+hours+":"+minutes+":"+secounds;
      console.log(data);
      return data;
    },
    // 转换性别
    getSex(str){
      return str === 'man'?'男':'女';
    },
    // 转换教育程度
    getEducation(str){
      return str === 'college'?'大学':'高中'
    },
    async getLoanList(){
      let params = {
        pageNo : 1,
        pageSize:10,
      };
      let res = await getLoanList(params);
      if(res?.data?.code === 20000) {
        this.tableData = res.data.data.data.data.map((item) => {
          item.birthday = this.getBirthday(item.birthday),
              item.sex = this.getSex(item.sex),
              item.education = this.getEducation(item.education);
          return item;
        });
      }
      //console.log(res.data.data.data.data);
    },
  },
  mounted() {
    this.getLoanList();
  }
}
</script>


<style>
.el-row{
  margin-bottom: 10px;
}
</style>

3.5 申请列表的操作

3.5.1 编辑删除提交操作

在这里插入图片描述
在这里插入图片描述

3.5.2 禁用状态

在这里插入图片描述
在这里插入图片描述

3.5.3 操作接口

src下的api文件的loan.js配置接口

import requset from "@/utils/request";

// 创建贷款申请
export const createLoan =(data)=>{
    return requset({
        url:'/loan/create',
        method:'POST',
        data
    })
}

// 获取表格数据接口
export const getLoanList = (params)=>{
    return requset({
        url:'/loan/list',
        method:'GET',
        params

    })
}

// 编辑申请列表接口
export const updateLoan=(params) =>{
    return requset({
        url:'/loan/update',
        method:'PUT',
        data
    })
}

// 删除申请列表接口
export const deleteLoan=(id)=>{
    return requset({
        url:'/loan/delete' + id,
        method:'DELETE',
    })

}

//提交审核接口
export const submitLoan=(id)=>{
    return requset({
        url:'/loan/submitToApprove',
        method:'POST',
        data:{id}
    })
}

3.5.4 搜索查询

在这里插入图片描述
在这里插入图片描述
提交审核后状态显示提交审核

3.5.5 申请列表分页功能

在src—views—application-manage—IndexView.vue
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5.6 申请列表编辑功能

编辑对话框放在table下面,添加相关属性及规则。

 <!--dialogVisible变量控制对话框是否显示-->
      <el-dialog title="申请管理-编辑" :visible="dialogVisible"  @close="dialogVisible=false"  width="30%">
        <div class="form-box">
          <el-form ref="updateForm" :model="updateForm" :rules="rules" label-width="80px">
            <el-row>
              <el-col
                  :xl=20 :lg=20
                  :md=12 :sm=24 :xs=24>
                <el-form-item label="姓名" prop="name">
                  <el-input  type='input' v-model="updateForm.name" ></el-input>
                </el-form-item>
              </el-col>
              <el-col
                  :xl=20 :lg=20
                  :md=12 :sm=24 :xs=24>
                <el-form-item label="性别" prop="sex">
                  <el-select  v-model="updateForm.sex" >
                    <el-option
                        key="man"
                        label=""
                        value="man">
                    </el-option>
                    <el-option
                        key="woman"
                        label=""
                        value="woman">
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
          </el-form>

          <div class="btns clear-fix">
            <div>
              <el-button type="primary" @click="submitUpdate">提交</el-button>
              <el-button @click="cleanFrom" >重置</el-button>
            </div>
          </div>

        </div>
      </el-dialog>

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Leetcode面试经典150_Q14最长公共前缀

题目&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 思路A&#xff1a;横向/纵向扫描 Python&#xff1a; class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:s "…

NPDP含金量高吗?什么人适合学习NPDP?

省流版&#xff1a;NPDP含金量挺高的&#xff0c;做产品的建议去学习下~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff0c;…

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python 动态规划五部曲&#xff08;完全平方数就是物品&#xff08;可以无限件使用&#xff09;&#xff0c;凑个正整数n就是背包&#xff0c;问凑满这个背包最少有多少物品…

小明的衣服-蓝桥1228-优先队列

解法 用优先队列&#xff0c;思路参考哈夫曼树&#xff08;贪心&#xff09; 思路&#xff1a;很复杂&#xff0c;说结果 n件同色衣服要染成都不同色&#xff0c;求邮费最少&#xff1b; 倒过来想&#xff1a;n件不同颜色衣服&#xff0c;要染成同一种颜色&#xff0c;求邮费…

tensorflow.js 使用 opencv.js 将人脸特征点网格绘制与姿态估计线绘制结合起来,以获得更高的帧数

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图 文章目录 系列文章目录前言一、实现步…

Python高级

不定长参数 位置不定长参数&#xff0c;获取参数args会整合为一个元组 def info(*args):print(arg is, args)print(type(arg) is, type(args))info(1, 2, 3, 4, a, b)# 输出 # arg is (1, 2, 3, 4, a, b) # type(arg) is <class tuple> 关键字不定长参数&#xff0c;&…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

Python代码识别minist手写数字【附pdf】

一、概述 对于人类而言,要识别图片中的数字是一件很容易的事情,但是,如何让机器学会理解图片上的数字,这似乎并不容易。那么,能否找出一个函数(模型),通过输入相关的信息,最终得到期望的结果呢? 二、python代码实现中涉及的输入输出内容: 输入:mnist数据集每一个…

HarmonyOS 开发-手写绘制及保存图片

介绍 本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能&#xff0c;并通过image库的packToFile和packing接口将手写板的绘制内容保存为图片。 效果图预览 使用说明 在虚线区域手写绘制&#xff0c;点击撤销按钮撤销前一笔绘制&#xff0c;点击重置按钮…

动态路由-基于vue-admin-template

基于 vue-admin-template的动态路由 1. 拆分静态路由与动态路由 静态路由----所有人都可以访问—首页/登录/404 动态路由–有权限的人才可以访问—组织/角色/员工/权限 2. 根据用户权限添加动态路由 获取对应的权限标识(vuex中actions中把用户资料通过return 进行返回&…

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解&#xff1a;110.平衡二叉树 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&…

CSS导读 (复合选择器)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS的复合选择器 2.1 什么是复合选择器 2.2 后代选择器(重要) 2.3 子选择器(重要) Questions 小提…

七年老测试整理的RF框架大全,一看就会,一学就懂

1.RF框架 全称robot framework,一个基于python开发的&#xff0c;自动化测试框架&#xff0c;这个框架可以做&#xff1a;web自动化&#xff0c;接口自动化&#xff0c;APP自动化。 github官网 1&#xff09;.安装python 检查python环境 python -V或 pip -V 2&#xff09;.…

【linux基础】bash脚本的学习:定义变量及引用变量、统计目标目录下所有文件行数、列数

假设目的&#xff1a;统计并输出指定文件夹下所有文件行数 单个文件可以用 wc -l &#xff1b;多个文件&#xff0c;可以用通配符 / 借助bash脚本 1.定义变量名&#xff0c;使用引号 a"bestqc.com.map" b"Anno.variant_function" c"enrichment/GOe…

UE4_导入内容_Alembic文件导入器

Alembic文件导入器 Alembic文件格式(.abc)是一个开放的计算机图形交换框架&#xff0c;它将复杂的动画化场景浓缩成一组非过程式的、与应用程序无关的烘焙几何结果。虚幻引擎4(UE4)允许你通过 Alembic导入器 导入你的Alembic文件&#xff0c;这让你可以在外部自由地创建复杂的…

android支付宝接入流程

接入前准备 接入APP支付能力前&#xff0c;开发者需要完成以下前置步骤。 本文档展示了如何从零开始&#xff0c;使用支付宝开放平台服务端 SDK 快速接入App支付产品&#xff0c;完成与支付宝对接的部分。 第一步&#xff1a;创建应用并获取APPID 要在您的应用中接入支付宝…

Hot100【十一】:编辑距离

// 定义dp[i][j]: 表示word1前i个字符转换到word2前j个字符最小操作数 // 初始化dp[m1][n1] class Solution {public int minDistance(String word1, String word2) {int m word1.length();int n word2.length();// 1. dp数组int[][] dp new int[m 1][n 1];// 2. dp数组初…

代码算法训练营day14 | 理论基础、递归遍历

day14&#xff1a; 理论基础二叉树的分类&#xff1a;二叉树的种类&#xff1a;满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树的存储方式&#xff1a;链式存储顺序存储 二叉树的遍历方式&#xff1a;深度优先和广度优先遍历实现方式 二叉树的定义&#xff1a; 递归遍历递…

【攻防世界】web2(逆向解密)

进入题目环境&#xff0c;查看页面信息&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;…

磁盘管理与文件管理

文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类&#xff1a; 1.机械硬盘&#xff1a;靠磁头转动找数据 慢 便宜 2.固态硬盘&#xff1a;靠芯片去找数据 快 贵 硬盘的数据结构&#xff1a;…