Vue保姆级项目教程:十万字零基础开发信贷管理系统!

项目简介与搭建过程

项目简介

需求背景

信贷管理系统是一种用于银行、金融机构或其他借贷组织用于管理信贷流程的软件系统。它可以帮助机构管理贷款申请、贷款审批、合同管理等相关流程,提高信贷业务的效率和准确性。

需求描述

本需求文档旨在定义信贷管理系统的功能和特性,以满足机构对于信贷业务管理的需求。
信贷管理系统项目基于vue2实现,鉴于vue2的语法已经停止维护,后期会考虑使用vue3重写本项目

搭建过程

新建项目命令

vue create credit-management-system

项目配置语言选择

项目配置.png

项目启动

npm run serve

登录页面初始化及其vue-router路由编写

配置路由

  1. 先把app.vue的默认代码删除,留下一个router-view路由出口
    App.vue
<template><div id="app"><router-view/></div>
</template>
  1. 打开router文件夹下的index.js,删除掉默认的路由配置
Vue.use(VueRouter)const routes = []const router = new VueRouter({routes
})export default router
  1. 在main.js里引入公共样式文件,导入和使用elementui组件

    引入elementui组件
cnpm i element-ui -S

导入使用

import App from './App.vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'Vue.use(ElementUI)
  1. 先在router文件夹下index.js添加一个登录页面的路由和重定向
    组件是使用的懒加载,可以减少页面加载时间
const routes = [{path:'/',redirect:'/login'},{path: '/login',name: 'Login',component: () => import('../views/Login.vue')},
]

LoginView.vue写css之后报错不能解析sass-loader
在命令行执行如下命令

npm install sass-loader -D
cnpm install node-sass -D

引入公共样式normalize.css文件之后出现错误
错误信息:

error2.png
解决方案:ctrl+shift+p,在setting.json中添加如下
“javascript.validate.enable”: false

编写登录页面

第一步

<div class="login-box"><div class="login-input-box center"><h1>信贷管理系统</h1></div></div>

第二步

先定义表单内容放到–上面的h1标签下面

<el-form :model="ruleForm" :rules="rules" status-icon ref="ruleForm" class="demo-ruleForm"><el-form-item prop="username"><el-input prefix-icon="el-icon-user-solid" v-model="ruleForm.username"></el-input></el-form-item><el-form-item prop="pass"><el-input prefix-icon="el-icon-s-order" type="password" v-model="ruleForm.pass" autocomplete="off"></el-input></el-form-item><el-button type="primary" @click="submitForm">提交</el-button></el-form>

第三步

1.data中定义一个ruleForm,接收用户名和密码

2.再定义一个rules,限制输入格式

3.在methods中添加一个submitForm表单提交方法和密码限制的validatePass方法

data中:

ruleForm: {username: "",pass: ""}
rules: {pass: [{validator: this.validatePass,trigger: "blur"}],username: [{ required: true, trigger: "blur", message: "请输入用户名" }]}

methods中:

validatePass(rule, value, callback) {if (value === "") {callback(new Error("请输入密码"));} else if (value.length < 6) {callback(new Error("密码不能小于6位数"));} else {callback();}},submitForm(){this.$refs.ruleForm.validate(valid => {if (valid) {// 如果验证通过,//调用login方法,传入登录信息,下面会定义this.login(this.ruleForm)} else {return false;}});}

4.创建login登录方法

async login(form){//成功后跳转到首页this.$router.replace("/home");
}

5.样式的引入

在main.js中引入样式

 import '@/assets/normalize.css';

6.在登录界面中引入下面样式

!!!注意语言是scss

<style lang="scss" scoped>
.login-input-box {width: 650px;height: 320px;background: #fff;text-align: center;padding: 40px 40px 12px 12px;
}.login-box {height: 100%;background: url(../assets/bg2.jpg);background-size: cover;
}.el-button {width: 600px;
}.el-input {width: 600px;margin-bottom: 16px;
}::v-deep .el-input__inner {background: #e5e5e5;
}
</style>

编写首页

添加路由规则

打开router文件夹下的index.js

其中的Layout为布局页面

//为routes添加
{path: '/',redirect:'/home',//下面这两个页面按照层级自行创建component:()=>  import('@/layout/layout.vue'),children:[{meta:{title:'首页'},path:'/home',component:()=> import('@/views/home.vue')}]}

layout布局和编写首页及其vue-router路由跳转

layout布局包括侧边栏,导航栏和内容部分

 <div><el-container><el-aside width="240px"><el-menu   class="el-menu-vertical-demo" background-color="#545c64"text-color="#fff" active-text-color="#ffd04b"><!--//没有二级导航的 --><el-menu-item index="1"><span slot="title"> 首页</span></el-menu-item><!--	//有二级导航的 --><el-submenu index="2"><template slot="title"><span>贷款管理</span></template><el-menu-item index="2-1">贷款申请</el-menu-item></el-submenu>   </el-menu></el-aside><el-container><el-header><!--//左侧面包屑--><div class="left">首页</div><!--//右侧用户名--><div class="right"><!--// //下拉菜单--><el-dropdown ><span class="el-dropdown-link"> admin </span><el-dropdown-menu slot="dropdown"><el-dropdown-item >退出登录</el-dropdown-item></el-dropdown-menu></el-dropdown></div></el-header><el-main><!-- //放置一个路由出口 --><router-view /></el-main></el-container></el-container></div>

侧边栏包含二级菜单,导航栏最右侧有一个退出登录选择,内容包括了数字滚动和echarts图表

数字滚动组件vue-count-to

官网:https://www.npmjs.com/package/vue-count-to
安装插件的命令如下

npm i -S vue-count-to@1.0.13

引入后插入页面使用,在使用命令安装过程中出现如下报错信息

error3.png
解决方案:

根据提示检查网络情况,更换手机热点(我开发过程中更换热点仍然报错,应该不是网络原因了)
修改npm的网络设置 npm config list

1.png
图中设置用到的命令如下

npm config set proxy null
npm config set https-proxy null
npm config set registry https://registry.npmjs.org/

最初查阅文档之类的设置了很多次,最后有点懵懵哒,npm init了

稍过一会,再次下载就ok了(也许是设置原因或者最初网络不佳,不是非常确定)

最后一次成功使用的命令是

cnpm i -S vue-count-to@1.0.13 

( npm是node官方的包管理器。 cnpm是个中国版的npm,是淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm)

2.png

首先设置3个栅格布局,其中属性作用,查看element-ui官网的layout布局

 <div class="home"><el-row :gutter="10"><el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24" ><div>1</div></el-col><el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24" ><div>2</div></el-col><el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24" ><div>3</div></el-col></el-row>
</div>

把栅格布局的内容使用数组遍历来显示

<el-row :gutter="10"><el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24" v-for="(item, index) in list"          :key="index"><div class="dashboard-item" :style="{ background: item.color }"><p>{{ item.title }}</p></div></el-col>
</el-row>

data中定义一个数组

 data(){return {list: [{ val: 13594, title: '最高可借金额', color: '#67ca3a', },{ val: 9833, title: '回报率', color: '#ff6600' },{ val: 8888, title: '业绩领跑', color: '#f56c6c' },{ val: 6666, title: '安稳底薪战队', color: '#409eff' }]}}

echarts图表

介绍echart

官网https://echarts.apache.org/zh/index.html

下载echarts并使用

  1. 下载
cnpm i -S echarts@4.9.0
  1. HomeViews页面引入
import echarts from 'echarts';

编写第一个图表

  1. 定义图表位置
<template><div class="home"><el-row :gutter="10"><el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24" v-for="(item, index) in             list"  :key="index"><div class="dashboard-item" :style="{ background: item.color }"><p>{{ item.title }}</p><CountTo :startVal="0" :endVal="item.val" :duration="3000" /></div></el-col></el-row><!-- 所有图表位置,一共3个 --><div class="echarts-box"><!-- 第一个图表位置--><div class="chart1"></div></div></div></template>
  1. 配置图表

添加一个initCharts方法

 initCharts() {//初始化图表实例,为什么要添加到this上面,因为后面要检测页面大小改变,更新图表大小this.chart1 = echarts.init(document.querySelector('.chart1'));//图表配置let option1 = {title: {},tooltip: {trigger: 'axis'},legend: {data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis: {type: 'category',boundaryGap: false,data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{name: 'Email',type: 'line',stack: 'Total',data: [120, 132, 101, 134, 90, 230, 210]},{name: 'Union Ads',type: 'line',stack: 'Total',data: [220, 182, 191, 234, 290, 330, 310]},{name: 'Video Ads',type: 'line',stack: 'Total',data: [150, 232, 201, 154, 190, 330, 410]},{name: 'Direct',type: 'line',stack: 'Total',data: [320, 332, 301, 334, 390, 330, 320]},{name: 'Search Engine',type: 'line',stack: 'Total',data: [820, 932, 901, 934, 1290, 1330, 1320]}]}//应用配置生成图表this.chart1.setOption(option1)}
  1. 在mounted生命周期里执行initCharts方法
mounted() {this.initCharts()}
  1. 图表没有显示

需要设置容器大小

 .chart1 {width: 100%;height: 400px;}

编写第二个图表

	<!-- 放在第一个图表下面     --> 
<div class="chart2"></div>
  1. 在initCharts方法中编写第二个图表数据
     this.chart2 = echarts.init(document.querySelector('.chart2'));//下面都是图表的配置,顺序不能错let posList = ['left','right','top','bottom','inside','insideTop','insideLeft','insideRight','insideBottom','insideTopLeft','insideTopRight','insideBottomLeft','insideBottomRight'];let app = {};app.configParameters = {rotate: {min: -90,max: 90},align: {options: {left: 'left',center: 'center',right: 'right'}},verticalAlign: {options: {top: 'top',middle: 'middle',bottom: 'bottom'}},position: {options: posList.reduce(function (map, pos) {map[pos] = pos;return map;}, {})},distance: {min: 0,max: 100}};app.config = {rotate: 90,align: 'left',verticalAlign: 'middle',position: 'insideBottom',distance: 15,onChange: function () {const labelOption = {rotate: app.config.rotate,align: app.config.align,verticalAlign: app.config.verticalAlign,position: app.config.position,distance: app.config.distance};this.chart2.setOption({series: [{label: labelOption},{label: labelOption},{label: labelOption},{label: labelOption}]});}};const labelOption = {show: true,position: app.config.position,distance: app.config.distance,align: app.config.align,verticalAlign: app.config.verticalAlign,rotate: app.config.rotate,formatter: '{c}  {name|{a}}',fontSize: 16,rich: {name: {}}};let option2 = {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},legend: {data: ['Forest', 'Steppe', 'Desert', 'Wetland']},toolbox: {show: true,orient: 'vertical',left: 'right',top: 'center',feature: {mark: { show: true },dataView: { show: true, readOnly: false },magicType: { show: true, type: ['line', 'bar', 'stack'] },restore: { show: true },saveAsImage: { show: true }}},xAxis: [{type: 'category',axisTick: { show: false },data: ['2012', '2013', '2014', '2015', '2016']}],yAxis: [{type: 'value'}],series: [{name: 'Forest',type: 'bar',barGap: 0,label: labelOption,emphasis: {focus: 'series'},data: [320, 332, 301, 334, 390]},{name: 'Steppe',type: 'bar',label: labelOption,emphasis: {focus: 'series'},data: [220, 182, 191, 234, 290]},{name: 'Desert',type: 'bar',label: labelOption,emphasis: {focus: 'series'},data: [150, 232, 201, 154, 190]},{name: 'Wetland',type: 'bar',label: labelOption,emphasis: {focus: 'series'},data: [98, 77, 101, 99, 40]}]};this.chart2.setOption(option2);
  1. 设置第二个图表的容器大小
.chart2 {height: 400px;width: 50%;}

编写第三个图表

      <!--放到第二个图表下面 -->
<div class="chart3"></div>
  1. 配置第三个图表信息
      this.chart3 = echarts.init(document.querySelector('.chart3'));let option3  = {angleAxis: {},radiusAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu'],z: 10},polar: {},series: [{type: 'bar',data: [1, 2, 3, 4],coordinateSystem: 'polar',name: 'A',stack: 'a',emphasis: {focus: 'series'}},{type: 'bar',data: [2, 4, 6, 8],coordinateSystem: 'polar',name: 'B',stack: 'a',emphasis: {focus: 'series'}},{type: 'bar',data: [1, 2, 3, 4],coordinateSystem: 'polar',name: 'C'

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录训练营第四天|面试题02.07链表相交

题目&#xff1a; 面试题 02.07. 链表相交 已解答 简单 相关标签 相关企业 提示 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目…

设计模式(工厂模式)

设计模式&#xff08;工厂模式&#xff09; 一、工厂模式介绍 在工厂模式中&#xff0c;父类决定生成示例的方式&#xff0c;但不决定所要生成的具体的类&#xff0c;具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。 二、示例程序 以下示例程…

ARM中汇编语言的学习(加法、乘法、除法、左移、右移、按位与等多种命令操作实例以及ARM的 N、Z、C、V 标志位的解释)

汇编概述 汇编需要学习的大致框架如下&#xff1a; 汇编中的符号 1.指令&#xff1b;能够北嘁肷梢惶?2bit机器码&#xff0c;并且能够被cpui识别和执行 2.伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令 3.伪操作&#xff1a;不会生成指令…

Kafka | SpringBoot集成Kafka

SpringBoot集成Kafka 一、前言二、项目1. pom2. application.properties4. 消息生产者-测试5. 消息消费者 三、启动测试四、有总结的不对的地方/或者问题 请指正, 我在努力中 一、前言 该文章中主要对SpringBoot 集成Kafka 主要是 application.properties 与 pom坐标就算集成完…

HTML5基础2

drag 可以把拖放事件拆分成4个步骤 设置元素为可拖放。为了使元素可拖动&#xff0c;把 draggable 属性设置为 true 。 <img draggable"true"> 拖动什么。ondragstart 和 setData() const dragestart (ev)>{ev.dataTransfer.setData(play,ev.target.id)} …

[云原生] k8s之存储卷

一、emptyDir存储卷 当Pod被分配给节点时&#xff0c;首先创建emptyDir卷&#xff0c;并且只要该Pod在该节点上运行&#xff0c;该卷就会存在。正如卷的名字所述&#xff0c;它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件&#xff0c;尽管该卷可以挂载到每…

如何不丢精度保存PPT中的图片,实测有效

1.在powerpoint软件中 文件-》选项 -》高级-》设置为不压缩&#xff0c;且默认输出为最高 2.导入对应图片后&#xff0c;右键导出图片&#xff0c;选择.emf文件 3.使用windows自带的画图工具打开.emf文件&#xff0c;ctrls另存为.png文件 此方法亲测可以生成清晰度很高的图片

python:布伊山德U检验(Buishand U test,BUT)突变点检测(以NDVI时间序列为例)

作者:CSDN @ _养乐多_ 本文将介绍布伊山德U检验(Buishand U test,BUT)突变点检测代码。以 NDVI 时间序列为例。输入数据可以是csv,一列NDVI值,一列时间。代码可以扩展到遥感时间序列突变检测(突变年份、突变幅度等)中。 结果如下图所示, 文章目录 一、准备数据二、…

【JavaEE进阶】 @Transactional详解

文章目录 &#x1f343;前言&#x1f332;rollbackFor&#xff08;异常回滚属性&#xff09;&#x1f384;事务隔离级别&#x1f6a9;MySQL事务隔离级别&#x1f6a9;Spring事务隔离级别 &#x1f38b;Spring事务传播机制&#x1f6a9;什么是事务传播机制&#x1f6a9;事务有哪…

spark 实验二 RDD编程初级实践

目录 一. pyspark交互式编程示例&#xff08;学生选课成绩统计&#xff09; 该系总共有多少学生&#xff1b; 该系DataBase课程共有多少人选修&#xff1b; 各门课程的平均分是多少&#xff1b; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…

关于Python读取Excel表格中的内容

1、准备 首先准备好Excel表&#xff0c;并向里面填充好内容 2、相关算法 import pandas as pd# file_path rE:\data.xlsx # r对路径进行转义&#xff0c;windows需要 file_path rdata.xlsx# 这行代码括号里的head0&#xff0c;表示excel文件中第一行是表头&#xff0c;…

解决ChatGPT发送消息没有反应

ChatGPT发消息没反应 今天照常使用ChatGPT来帮忙码代码&#xff0c;结果发现发出去的消息完全没有反应&#xff0c;即不给我处理&#xff0c;也没有抱任何的错误&#xff0c;按浏览器刷新&#xff0c;看起来很正常&#xff0c;可以查看历史对话&#xff0c;但是再次尝试还是一…

MySQL安装使用(mac)

目录 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 一、下载MySQL 打开 MySql 官方下载页面 我是macOS12&#xff0c;所以选择了8.0.30 下载完成之后&#xff0c;打开安装&#xff0c;一直下一步安装完成&#xff0c;在最后安装完成时&#xff0c;会弹出…

《赵玉平说职场智慧》读书笔记

目录 一、宋江是如何成为笼络人心的领导 二、给你一个干的理由——宋江的精神激励策略 三、团队如何应对这种多样化的挑战 帮领导解决难题 帮领导打退强敌 替领导四处出席 帮领导做好杂事 帮领导打响名气 四、小人难养&#xff0c;小心唯上 五、如何拒绝&#xff1f; …

Python和Google Colab进行卫星图像二维小波变化和机器学习

2D 小波分解是图像处理中的一种流行技术,使用不同的滤波器将图像分解为不同的频率分量(“近似”和“细节”系数)。该技术对于各种图像处理任务特别有用,例如压缩、去噪、特征提取和边缘检测。 在本文中,我们将演示如何在 Google Colab 中使用 Python 下载高分辨率样本卫星…

什么是MAE和MSE?

平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;和平均方差误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;是常用的评价回归模型性能的指标。它们用于衡量模型预测值与真实值之间的差异。 在深度学习领域&#xff0c;MAE 和 MSE 是…

python使用selenium webdriver chrome

安装selenum包 pip install selenium 安装chrome驱动 查看chrome版本 安装驱动 下载地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/#stable 找到符合版本的驱动下载&#xff0c;解压&#xff0c;把解压后的路径加入PATH环境变量中&#xff1a; …

单片机为什么需要时钟?2种时钟电路对比?

目录 一、晶体振荡器&#xff08;Crystal Oscillator&#xff09;的核心知识 二、单片机为什么需要时钟电路&#xff1f; 三、单片机的时钟电路方案 01、外部晶振方案 02、内部晶振方案 四、总结 单片机研发设计的项目中&#xff0c;它的最小电路系统包含 电源电路复位…

MySQL安装与卸载

安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装(全部默认就可以) 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 配置 安装好MySQL之后&#xff0c;还需要配置环境变量&am…

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择

在当今数据爆炸的时代&#xff0c;数据库作为存储和管理数据的核心组件&#xff0c;其性能和扩展性成为了企业关注的重点。随着业务的发展和数据量的不断增长&#xff0c;传统的单库单表架构逐渐暴露出性能瓶颈和扩展性限制。为了应对这些挑战&#xff0c;企业常常需要在分库分…