Vue3+nodejs全栈项目(资金管理系统)——前端篇

news2024/11/23 3:05:50

文章目录

  • 创建项目
    • 项目初始化
      • 使用element-plus
    • 设置Register和404组件
    • 搭建element注册表单
      • 验证表单和按钮
    • 加载动画和消息提醒
    • 路由守卫和token过期处理
      • 配置请求拦截和响应拦截
      • 解析token并存储到vuex中
    • 设计顶部导航
    • 设置首页和个人信息
    • 设置左侧导航栏
    • 展示资金管理页面
    • 添加按钮
    • 编辑和删除
    • 实现分页结构&功能
    • 实现筛选功能&权限功能

创建项目

在这里插入图片描述
新建的项目 打开 template下面有蓝色波浪线
解决方法:参考博客—— template蓝色波浪线

项目初始化

删掉不必要的文件和路由。
初始化样式,在assets下新建文件夹less,该文件夹下新建 reset.less存放一些初始化样式,然后新建index.less在其中引入reset.less

@import "./reset.less";

main.js中全局引入

import './assets/less/index.less'

init改动代码

使用element-plus

官网文档

yarn add element-plus --save

在将项目中所需要用到的图片 放入到assets/images目录下

设置Register和404组件

新建views/register/Register.vue

router.index.js 中配置路由

{
   path: '/register',
   name: 'register',
   component: () => import("../views/register/Register.vue")
 },

新建views/NotFound.vue

router/index.js中配置路由

{
  path: '/:pathMatch(.*)',
  name: 'notfound',
  component: () => import("../views/NotFound.vue")
}

404页面如下:

在这里插入图片描述

搭建element注册表单

自定义校验规则

验证表单和按钮

用到相关知识点:vue3 - vue3中使用ref来获取dom节点

用Element-plus组件 真的样式上有很多让人无奈的地方,感觉还不如自己写一个表单组件。。。

该part提交的代码——gitee[register&404]

在这里插入图片描述

加载动画和消息提醒

加载动画和消息提醒 都发生在点击注册按钮之后。

点击注册按钮,注册成功的话 我们注册的信息,就会被放入到用户的数据库表内。

element-plus——Loading 加载

所以我们需要访问后端,要安装axios
yarn add axios

使用axios, 我们需要用到请求拦截和响应拦截

src目录下新建文件http.js

import axios from 'axios'

// 请求拦截


// 响应拦截

export default axios

main.js中引入

import Axios from './http'
const app = createApp(App)

app.config.globalProperties.$axios = Axios

涉及知识点:Vue3使用axios

vue3配置全局参数(挂载全局方法)以及组件使用方法

编写代码后,输入注册信息用户名为test 密码为123321 测试,注册成功,已在数据库表中可以看到该用户信息
在这里插入图片描述
Register.vue拷贝快速弄出Login.vue

登录成功,我们拿到token

此部分提交的代码——gitee[全局axios&消息提醒&加载动画]

路由守卫和token过期处理

目前没有登录 也可以访问其他页面

路由守卫:在没有登录之前,只能访问登录页面或者注册页面,其他页面都无妨访问。
在这里插入图片描述

配置请求拦截和响应拦截

登录成功之后应该将当前的token,设置为请求头,
在响应拦截的时候判断当前的token是否是过期的,如果是过期的话,就“干掉它”,未过期,则正常使用。
src/http.js

import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import router from './router/index'

let loading;
const startLoading = () => {
    loading = ElLoading.service({
        lock: true,
        text: "拼命加载中...",
        background: "rgba(0, 0, 0, .7)"
    })
}

const endLoading = () => {
    loading.close()
}

// 请求拦截
axios.interceptors.request.use(config => {
    // 加载动画
    startLoading()

    if (localStorage.mytoken) {
        // 设置统一的请求头 header
        config.headers.Authorization = localStorage.mytoken
    }

    return config
}, error => {
    return Promise.reject(error)
})

// 响应拦截
axios.interceptors.response.use(response => {
    // 结束加载动画
    endLoading()
    return response
}, error => {
    // 错误提醒
    endLoading()
    ElMessage.error(error.response.data)

    // 获取错误状态码
    const { status } = error.response
    if (status == 401) {
        ElMessage.error("token失效,请重新登录")
        // 清除token
        localStorage.removeItem('mytoken')
        // 重新跳转登录页面
        router.push("/login")
    }
    return Promise.reject(error)
})

export default axios

解析token并存储到vuex中

yarn add jwt-decode

Login.vue
在这里插入图片描述src/store/index.js

import { createStore } from 'vuex'

const types = {
  SET_AUTHENTICATED: "SET_AUTHENTIATED", // 是否认证通过
  SET_USER: "SET_USER", // 用户信息
};

const state = {
  isAuthenticated: false,
  user: {}
}


const getters = {
  isAuthenticated: state => state.isAuthenticated,
  user: state => state.user
}

const mutations = {
  [types.SET_AUTHENTICATED](state, isAuthenticated) {
    if (isAuthenticated) state.isAuthenticated = isAuthenticated
    else state.isAuthenticated = false
  },

  [types.SET_USER](state, user) {
    if (user) state.user = user
    else state.user = {}
  }
}

const actions = {
  setAuthenticated: ({ commit }, isAuthenticated) => {
    commit(types.SET_AUTHENTICATED, isAuthenticated);
  },
  setUser: ({ commit }, user) => {
    commit(types.SET_USER, user);
  },
}
export default createStore({
  state,
  getters,
  mutations,
  actions,
})

在这里插入图片描述

但是此时页面一刷新 就会又变成:
在这里插入图片描述

解决方法:
App.vue中加入以下代码:

<script setup>
import jwt_decode from "jwt-decode";
import { useStore } from "vuex";
import { onMounted } from "vue";
const store = useStore();

// 判断是否为空的方法
const isEmpty = (value) => {
  return (
    value === undefined ||
    value === null ||
    (typeof value === "object" && Object.keys(value).length === 0) ||
    (typeof value === "string" && value.trim().length === 0)
  );
};

onMounted(() => {
  if (localStorage.mytoken) {
    const decoded = jwt_decode(localStorage.mytoken);
    // token存储到vuex中
    store.dispatch("setAuthenticated", !isEmpty(decoded));
    store.dispatch("setUser", decoded);
  }
});
</script>

此部分改动的代码——gitee[路由守卫&token解析&存储到vuex]

设计顶部导航

遇到的问题:vue3Element Plus中icon图标不显示问题的解决

在这里插入图片描述
此部分提交的代码:gitee[顶部导航&退出]

设置首页和个人信息

在这里插入图片描述
此部分提交的的代码:gitee[首页&个人中心]

设置左侧导航栏

components/LeftMenu.vue

代码——gitee

展示资金管理页面

后台要添加一个关于 资金管理的

创建时间
收支类型:优惠券?
收支描述: 购买课程
收入: 200
支出:200
账户现金:5000
备注:购买Vue全栈课程

后台已添加


在这里插入图片描述

添加的代码

添加按钮

点击添加按钮 弹出对话框 输入内容后,然后页面立马显示添加的内容

此部分功能添加的代码——gitee[对话框&添加功能]

编辑和删除

由于点击编辑和点击添加 想要获得的对话框相似,只不过点击了编辑之后,我们的文本框内会带有内容。 所以我们要判断出是点击了编辑还是添加,然后里面部分内容不一样即可。

此部分提交的代码——gitee[编辑&删除]

实现分页结构&功能

element plus设置中文语言方法

在这里插入图片描述

此功能部分提交的代码——分页功能

实现筛选功能&权限功能

筛选功能部分代码

权限(管理员/员工)不同角色登录有不同的效果。

比如普通员工不能添加删除

代码提交_筛选&权限

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

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

相关文章

返回当前系统串口名称

主要针对当前的usb转串口进行了穷举。 方便判断串口对应哪个设备。 返回串口名称 类对象&#xff0c;&#xff08;包含了参考网址&#xff0c;以及对其进行了修改&#xff0c;防止出现蓝牙端口&#xff09; using System; using System.Collections.Generic; using System.L…

VMware-KVM安装

目录 VMware-KVM安装 一、kvm虚拟化平台 KVM 网络管理&#xff08;以NAT网卡为例[ens33]&#xff09; VMware-KVM安装 一台Centos7、一个winSCP上传文件工具&#xff1b; 搭建KVM平台 一、kvm虚拟化平台 1 cat /etc/hosts ##查看主机…

ecology修改Reisn的JDK目录

修改resin运行JDK&#xff1a; 用文本编辑器打开resin/bin/resin.sh文件&#xff0c;将JAVA_HOME改为要设置的JDK路径。

springboot(spring)整合redis(集群)、细节、底层配置讲解

文章目录一.springboot整合redis.1.引入依赖.2.添加配置.3.使用封装对象举例二.细节讲解出现问题,堆外内存溢出解决方案,切换客户端三.补充原理.一.springboot整合redis. 1.引入依赖. <dependency><groupId>org.springframework.boot</groupId><artifact…

Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系解析

在我们日常的开发中&#xff0c;我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做&#xff0c;Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下&#xff0c;二者的区别和联系。希望给大家进行选择的时候&#xff0c;提供一些帮助…

DSP/BIOS的基本介绍

DSP/BIOS的基本介绍 DSP/BIOS是一个简易的实时嵌入式操作系统&#xff0c;主要面向实时调度与同步、主机/目标系统通信&#xff0c;以及实时监测等应用&#xff0c;具有实时操作系统的诸多功能&#xff0c;如任务的调度管理、任务间的同步和通信、内存管理、实时时钟管理、中断…

(十)再探反向传播和神经网络优化

文章目录1.背景介绍2.神经网络的模型3.神经网络中的参数更新初探3.1随机查找取最优3.2局部随机查找参数更新3.3 沿着梯度反方向更新4.链式法则与反向传播5.梯度方向的参数更新策略6.学习率退火6.1学习率衰减策略基础6.2 二阶优化方法6.3自适应学习率方法参考资料欢迎访问个人网…

Java基础之接口与抽象类区别

Java基础之接口与抽象类区别一、Java基础之接口与抽象类二、抽象类和最终类三、Java移位运算符四、局部变量为什么要初始化一、Java基础之接口与抽象类 一个子类只能继承一个抽象类, 但能实现多个接口抽象类可以有构造方法, 接口没有构造方法抽象类可以有普通成员变量, 接口没…

minikube helm 安装 jenkins

文章目录1. 准备条件2. 安装 helm3. 部署 jenkins3.1 创建 namespace jenkins3.2 创建存储卷 jenkins-volume3.3 创建 service account & RBAC3.4 定制 jenkins-values.yml3.5 安装 jenkins3.6 登陆 jenkins“Jenkins是一个著名的可扩展开源 CI/CD 工具&#xff0c;用于自动…

手写数字识别Mnist数据集和读取代码分享

数据集下载 链接&#xff1a; https://pan.baidu.com/s/1qpzrSFhmyrdGmbSScN_ZXg?pwdd1ws 提取码&#xff1a;d1ws 数据集读取 from pathlib import Path import requests ​ DATA_PATH Path("data") PATH DATA_PATH / "mnist" ​ PATH.mkdir(parent…

Android Navigation基本使用

目录1. Navigation概述2. Navigation组成3. 设置环境4. 使用方法4.1. 创建导航图4.1.1. 具体操作4.2. 向Activity添加NavHost4.2.1. 通过 XML 添加4.2.2. 使用布局编辑器添加4.3. 在导航图中创建目的地4.3.1. 具体操作4.4. 连接目的地4.4.1. 具体操作4.5. 目的地之间的导航4.5.…

认识3dmax 对象属性对话框

可以从右键或编辑菜单访问此对话框&#xff1b; 在此可以查看和编辑参数&#xff0c;以确定选定对象在视口和渲染过程中的行为&#xff1b; 包含3个面板&#xff1a;常规&#xff0c;高级照明&#xff0c;用户定义&#xff1b; 常规面板包含6个组&#xff1a;对象信息&#x…

[附源码]计算机毕业设计校园疫情管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

三、Git本地仓库基本操作——git仓库忽略跟踪文件

1. .gitignore文件 在工作区中的文件内容&#xff0c;很多时候我们基本只关注源文件。所以&#xff0c;肯定有些文件是不想使用git去管理的&#xff0c;比如&#xff1a; 编译生成的中间文件相关的IDE工程文件&#xff08;当然也可以进行git管理&#xff09;一些固定内容的说…

国外打工人分享如何如何通过销售excel电子表格赚到 28 万美元

在不到 2 年的时间里,这是我在 Etsy 上销售电子表格模板(Google 表格 + Excel)的收入。 而且我无论如何都不是电子表格专家。 但我确实知道如何找到有需求的数字产品,并且会帮助人们在通常需要更长时间才能完成的事情上节省时间。 我还没有看到很多人谈论这个,所以我想…

【图像分类损失】Encouraging Loss:一个反直觉的分类损失

论文题目&#xff1a;《Well-classified Examples are Underestimated in Classification with Deep Neural Networks》 论文地址&#xff1a;https://arxiv.org/pdf/2110.06537.pdf 1.背景 深度分类模型背后的一般常识是专注于分类错误的样本&#xff0c;而忽略远离决策边界的…

Studio 3T工具下载安装及使用教程

一、下载安装 官方网址&#xff1a;The Professional Client, IDE and GUI for MongoDB | Studio 3T 二、使用教程 CRUD操作&#xff1a; 打开命令行窗口&#xff0c;Open intelliShell 插入一个文档&#xff0c;db.collection.insertOne() 插入多个文档&#xff0c;db.coll…

[附源码]计算机毕业设计springboot中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PS画布基本操作 新建保存 图片类型区分设置

观看本文需要您的电脑装配有ps软件 如果没有 可以查看我的文章 PS软件下载安装以基本配置 然后我们打开ps软件 然后点击右上角 文件 然后选择 新建 然后可以配置一下 右边的话 我们可以设置 高度 和 宽度 都是数值 其次是要指定你这个数值的单位 一般情况下 都会用像素 一…

Vue(第十五课)Pinia组件库的基本知识

为什么要使用 Pinia&#xff1f; Pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。 如果您熟悉 Composition API&#xff0c;您可能会认为您已经可以通过一个简单的 export const state reactive({}). 这对于单页应用程序来说是正确的&#xff0c;但如果它是…