vue2+若依框架plus交互 路由介绍

本周及寒假

参加了校企合作的工程过程管理,和学长学姐一起写项目,之前学了vue也没有应用,然后对框架很多组件的用法不太了解,前期耽误了一些时间。

框架模块

首先是框架模块的介绍 api存了一些系统管理及发送请求的方法
在这里插入图片描述
例如project.js

import request from '@/utils/request'
import { getToken } from '@/utils/auth'
//添加新的公司
let token = getToken();
export function getTypeOnline(compName, compType) {
    return request({
        url: `/project/queryCompany?name=${compName}&type=${compType}`,
        headers: {
            isToken: true,
            token: `Bearer ${token}`
        },
        method: 'post',
     
    })
}

然后是asset文件夹 存了文件的静态资源
在这里插入图片描述
component存的是用到的组件 layout也是组件 可以将页面的组件拆分展示成多个
plugins仿制的是插件进行鉴权等等,router是路由配置文件 store放置的是拆分出来的vuex里面的分模块化的内容

在这里插入图片描述

路由配置

菜单配置路由

若依框架可以通过菜单进行路由配置 进入系统管理的菜单管理
在这里插入图片描述
通过改变菜单的目录和菜单进行配置 输入组件路径和路由地址 既可以在左边侧边栏渲染出导航栏
在这里插入图片描述

路由配置

这是我配置的路由 因为本来在菜单设置的三级路由一直报错 这个配置的路由可以通过
meta: { title: ‘首页’}渲染你面包屑

 {
    path: '',
    component: Layout,
    redirect: 'homePage',
    meta: { title: '首页', icon: 'dashboard', affix: true },
    children: [
      {
        path: 'homePage',
        component: () => import('@/views/home/homePage'),
        name: 'homePage',
        meta: { title: '公司库', icon: 'dashboard', affix: true },
        children:[
        ]
      },
        {
            path: 'project',
            component: () => import('@/views/home/projectManeger'),
            name: 'Project',
            meta: { title: '工程管理', icon: 'dashboard', affix: true },
            children: [{
              path: 'projectMain/:param',
              props: true,
              component: () => import('@/views/home/projectMain'),
              name: 'projectMain',
              hidden: true,
              meta: { title: '工程详情', icon: 'dashboard', affix: true, }
            }
            ],
          },
    ]
  },

登录逻辑

若依的登录逻辑是写好了的 在login.vue我们可以看到如下代码

 handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          if (this.loginForm.rememberMe) {
            Cookies.set("username", this.loginForm.username, { expires: 30 });
            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
          } else {
            Cookies.remove("username");
            Cookies.remove("password");
            Cookies.remove('rememberMe');
          }
         this.$store.dispatch("Login", this.loginForm)
          .then(() => {
            this.$router.push({ path: '/home/homePage' || "/" }).catch(()=>{});
          }).catch(() => {
            this.loading = false;
            if (this.captchaEnabled) {
              this.getCode();
            }
          });
        }
      });
    }

可以看出登录调用的是vuex里面的内容 可以在store->modules->user.js里面控制
在action可以看到

Login({ commit }, userInfo) {
      const username = userInfo.username.trim()
      const password = userInfo.password
      const code = userInfo.code
      const uuid = userInfo.uuid
      return new Promise((resolve, reject) => {
        login(username, password, code, uuid).then(res => {
          setToken(res.data.token)
          commit('SET_TOKEN', res.data.token)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

发送请求的login方法在src/api/login.js中
这个request是若依封装的拦截器

import request from '@/utils/request'

// 登录方法
export function login(username, password, code, uuid) {
  const data = {
    username,
    password,
    code,
    uuid
  }
  return request({
    url: '/login',
    headers: {
      isToken: false
    },
    method: 'post',
    data: data
  })
}

存储token的部分 在src/utils/auth.js中

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken() {
  return Cookies.get(TokenKey)
}

export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

export function removeToken() {
  return Cookies.remove(TokenKey)
}

交互

写的是分页 点击删除之后更新 所以把数据以及页数存储到了vuex中

<template>
  <div class="componnentMain">
    <div class="addNewCom">
      <button @click="addNewomponent('add-newCoponent')" id="addnewBtn">
        新增
      </button>
      <el-dialog :title="dialogComtitle" :visible.sync="addDialogCom">
        <template v-if="currentComponent == 'add-newCoponent'">
          <add-newCoponent :addDialogCom.sync="addDialogCom" />
        </template>
        <template v-else>
          <edit-comVue
            :addDialogCom.sync="addDialogCom"
            :listData="ownlistData"
          />
        </template>
      </el-dialog>
    </div>
    <el-table :data="dataList" style="width: 97%" class="comLable">
      <el-table-column prop="compName" label="公司名称" width="260">
      </el-table-column>
      <el-table-column prop="createTime" label="创建时间" width="195">
        <template slot-scope="{ row }">
          {{ turnshowTime(row.createTime) }}
        </template>
      </el-table-column>
      <el-table-column prop="compType" label="公司类别" width="190">
      </el-table-column>
      <el-table-column prop="compInvite" label="注册邀请码" width="330">
        <template slot-scope="{ row }">
          <span class="address-container">{{ row.compInvite }}</span>
          <!-- img 放在 span 之后 -->
          <img
            class="copyVisit"
            src="@/assets/images/copy.png"
            alt=""
            srcset=""
          />
        </template>
      </el-table-column>
      <el-table-column label="操作" width="241" fixed="right">
        <template slot-scope="{ row }">
          <span class="combtn" @click="editcomponent('edit - comVue', row)">
            详情
          </span>
          <span class="combtn" @click="editcomponent('edit - comVue', row)">
            编辑
          </span>
          <span class="deleteCom" @click="delteCompany(row.id)"> 删除 </span>
        </template>
      </el-table-column>
    </el-table>
    <div class="pageComChange">
      <div class="pageComChangeCenter">
        <el-pagination
          background
          layout="prev, pager,next"
          :page-count="Number(totalPages)"
          :current-page="currentPage"
          @current-change="handleCurrentChange"
        >
        </el-pagination>
      </div>
    </div>
  </div>
</template>
import { mapState, mapMutations, mapActions } from "vuex";
//先引入vuex模块
export default {
  components: {
    "add-newCoponent": addnewComVue,
    "edit-comVue": editComVue,
  },
  computed: {
    ...mapState("companyPage", [
      "pageSize",
      "totalPages",
      "dataList",
      "searchConten",
    ]),
  },
  currentPage: {
    get() {
      return this.currentPage;
    },
    set(val) {
      this.handleCurrentChange(val);
    },
  },
  mounted() {
    this.fetchData();
    //在挂载调用一次分页接口
  },

  methods: {
    addNewomponent(componentType) {
      this.currentComponent = componentType;
      this.addDialogCom = !this.addDialogCom;
      this.dialogComtitle = "新建公司";
    },
    editcomponent(componentType, rowData) {
      this.currentComponent = componentType;
      this.addDialogCom = !this.addDialogCom;
      this.dialogComtitle = "修改公司信息";
      this.ownlistData = rowData;
    },
    ...mapMutations("companyPage", [
      "searchCompanysendMethos",
      "updatePagination",
    ]),
    ...mapActions("companyPage", ["serachComoanyactions", "fetchData"]),

    handleCurrentChange(val) {
      this.currentPage = val;
      if (this.searchConten == "" || this.searchType == "") {
        this.updatePagination({
          currentPage: val,
          pageSize: this.pageSize,
        });
        this.fetchData();
      } else {
        this.searchCompanysendMethos({
          currentPage: 1,
          pageSize: this.pageSize,
          searchConten: this.searchComvalue,
          searchType: this.searchType,
        });
        this.serachComoanyactions();
      }
    },
    delteCompany(id) {
      this.$confirm("确定要删除该公司吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          const comids = [id];
          deleteCompany(comids).then((data) => {
            if (data.code == 200) {
              this.$message.success('删除公司成功')
              //这是判断有没有搜索内容
              if (this.searchConten == "" || this.searchType == "") {
                this.updatePagination({
                  currentPage:this.currentPage,
                  pageSize: this.pageSize,
                });
                this.fetchData();
              } else {
                this.searchCompanysendMethos({
                  currentPage: 1,
                  pageSize: this.pageSize,
                  searchConten: this.searchComvalue,
                  searchType: this.searchType,
                });
                this.serachComoanyactions();
              }
            } else {
              this.$message.error("删除该公司失败");
            }
          });
        })
        .catch((error) => {
          console.log(error);
        });
    },
    turnshowTime(timestamp) {
      // 使用导入的时间转换方法
      return turnshowTime(timestamp);
    },
  },
  data() {
    return {
      currentComponent: "",
      dialogComtitle: "",
      addDialogCom: false,
      currentPage: 1,
      ownlistData: {},
    };
  },
};

首先先注册模块

//store/index.vue
const store = new Vuex.Store({
  modules: {
    app,
    dict,
    user,
    tagsView,
    permission,
    settings,
    companyPage,
    projectPage
  },
  getters
})

模块里面的命名空间要设置为true 并进行传递数据的更新

import { getAllCompany,getSearchCompany} from "../../api/company";
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const companyPage=({
  namespaced: true,
  state: {
  currentPage: 1,
  pageSize: 10,
  totalPages: 0,
  searchConten:'',
  searchType:"",
  dataList: [] // 存储数据列表
  },
  mutations: {
  updatePagination(state, payload) {
    state.currentPage = payload.currentPage;
    state.pageSize = payload.pageSize;
    state.totalPages = payload.totalPages;
    
  },
  updateDataList(state, dataList) {
    state.dataList = dataList;
  },
  searchCompanysendMethos(state, payload) {
    state.currentPage = payload.currentPage;
    state.pageSize = payload.pageSize;
    state.totalPages = payload.totalPages;
    state.searchType=payload.searchType,
    state.searchConten=payload.searchConten
  },
  updateSearchList(state, dataList) {
    state.dataList = dataList;
  }
  },
 actions: {
  async fetchData({ commit, state }) {
    try {
    // 调用接口获取公司数据
    const response = await getAllCompany(state.pageSize,state.currentPage);
    // 更新分页状态
    commit('updatePagination', {
      currentPage: state.currentPage,
      pageSize: state.pageSize,
      totalPages: response.pages,
      dataList:response.records,

    });

    // 更新数据列表
    commit('updateDataList', response.records);
    } catch (error) {
    console.error('Error fetching company data:', error);
    }
  },
  async serachComoanyactions ({ commit, state }) {
    try {
    // 调用接口获取公司数据
    const response = await getSearchCompany(state.pageSize,state.currentPage,state.searchConten,state.searchType);
    commit('searchCompanysendMethos', {
      currentPage: state.currentPage,
      pageSize: state.pageSize,
      totalPages: response.pages,
      dataList:response.records,

    });

    // 更新数据列表
    commit('updateDataList', response.records);
    } catch (error) {
    console.error('Error fetching company data:', error);
    }
  }
}
});
export default companyPage

总结

vue写项目比之前用原生js写项目代码量要少得多 同时 框架好用是好用 但是要了解他的项目架构以及自带的一些方法

下周计划

先完成项目 然后学习一下ts 寒假没完全学完

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…

redis7.2.2|Dict

文章目录 StructredisDBdictdictTypedictEntry 宏定义散列函数散列冲突dictEntry pointer bit tricks[指针位技巧]API implementation_dictReset_dictInitdictCreatedictGetHashdictSetKeydictSetValdictSetNextdictGetNextdictGetValdictGetKey_dictCleardictEmptydictRelease…

五、西瓜书——集成学习

1.个体与集成 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能&#xff0c;这对“弱学习器”(weak learner)尤为明显因此集成学习的很多理论研究都是针对弱学习器进行的而基学习器有时也被直接称为弱学习器。 要获得好的集成个体学习器应“好而不同”…

详解JavaScript的函数

详解 JavaScript 的函数 函数的语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) { 函数体 return 返回值; // return 语句可省略 } 函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 示例代码 //定义的没有参数列表&am…

5个好玩神奇还免费的工具网站收藏不后悔-搜嗖工具箱

生命倒计时 http://www.thismuchlonger.com 这是一个相哇塞的网站&#xff0c;可以让我们静下心来好好想想我们来这个世界究竟为了什么&#xff0c;因为当我们作为命运的主宰者。敲打键盘设定好自己一生长度的时候&#xff0c;我们的剩余寿命已经成绝对值&#xff0c;一旦生命…

mysql5.7配置主从

原理&#xff1a; MySQL主从复制的工作原理如下:1. 主服务器产生Binlog日志当主服务器的数据库发生数据修改操作时,如INSERT、UPDATE、DELETE语句执行,主服务器会记录这些操作的日志信息到二进制日志文件中。2. 从服务器读取Binlog日志 从服务器会向主服务器发送请求,主服务器把…

Linux网络编程——socket 通信基础

Linux网络编程——socket 通信基础 1. socket 介绍2. 字节序2.1 简介2.2 字节序举例2.3 字节序转换函数 3. socket 地址3.1 通用 socket 地址3.2 专用 socket 地址 4. IP地址转换&#xff08;字符串ip -> 整数&#xff0c;主机、网络字节序的转换 &#xff09;5. TCP 通信流…

智能驾驶规划控制理论学习05-车辆运动学规划案例分析

目录 案例一——Hybrid A*&#xff08;基于正向运动学&#xff09; 1、基本思想 2、 实现流程 3、启发函数设计 4、分析扩张&#xff08;Analytic Expansions&#xff09; 5、分级规划&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

Vue3快速上手(十六)Vue3路由传参大全

Vue3路由传参 一、传参的多种方式 1.1 拼接方式 这种方式适合传递单个参数的情况&#xff0c;比如点击查看详情&#xff0c;传个id这样的场景 传参&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

RabbitMQ相关问题

RabbitMQ相关问题 一、RabbitMQ的核心组件和工作原理&#xff1f;二、如何保证消息可靠投递不丢失的&#xff1f;三、RabbitMQ如何保证消息的幂等性&#xff1f;四、什么是死信队列&#xff1f;死信队列是如何导致的&#xff1f;五、RabbitMQ死信队列是如何导致的&#xff1f;六…

PDF 解析问题调研

说点真实的感受 &#xff1a;网上看啥组件都好&#xff0c;实际测&#xff0c;啥组件都不行。效果好的不开源收费&#xff0c;开源的效果不好。测试下来&#xff0c;发现把组件融合起来&#xff0c;还是能不花钱解决问题的&#xff0c;都是麻烦折腾一些。 这里分享了目前网上能…

数据结构 第3章 栈、队列和数组(一轮习题总结)

第3章 栈、队列和数组 3.1 栈3.2 队列3.3 栈与队列的应用3.4 数组和特殊矩阵 3.1 栈&#xff08;1 10 11 20&#xff09; 3.2 队列&#xff08;6 12 14 17&#xff09; 3.3 栈与队列的应用&#xff08;6 11&#xff09; 3.4 数组和特殊矩阵 3.1 栈 T1 栈和队列具有相同的逻辑…

一周学会Django5 Python Web开发-Django5详细视图DetailView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux-信号2

文章目录 前言一、信号是如何保存的&#xff1f;int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset (sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);int sigismember&#xff08;const sigset_t *set, int signo);int sigpen…

leetcode 长度最小的子数组

在本题中&#xff0c;我们可以知道&#xff0c;是要求数组中组成和为target的最小子数组的长度。所以&#xff0c;我们肯定可以想到用两层for循环进行遍历&#xff0c;然后枚举所有的结果进行挑选&#xff0c;但这样时间复杂度过高。 我们可以采用滑动窗口&#xff0c;其实就是…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

同样是证书,NPDP和PMP有什么区别?

PMP和NPDP的区别是啥&#xff1f; PMP、NPDP证书考哪个更有用&#xff1f;还是两个都考&#xff1f; PMP和NPDP哪个更适合现在及以后发展&#xff1f; PMP和NPDP这两哪个含金量更高&#xff1f; 一&#xff0c;关于PMP和NPDP PMP和NPDP都是美国PMI/PDMA的专业考试&#xf…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句&#xff08;选择结构&#xff09;5.1 if语句5.1.1 语法形式5.1.2 else…

Stable Cascade又升级了,现在只需要两个模型

Stable Cascade这个模型&#xff0c;大家如果还有印象的话&#xff0c;是需要下载三个模型的&#xff0c;分别是Stage_a,Stage_b和Stage_c,如果全都下载下来&#xff0c;需要20多个G&#xff0c;但是最近使用ComfyUI做尝试的时候&#xff0c;发现官方的案例中已经没有用到单独的…