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

news2024/9/30 19:41:18

本周及寒假

参加了校企合作的工程过程管理,和学长学姐一起写项目,之前学了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 寒假没完全学完

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

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

相关文章

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

Vue+SpringBoot打造大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

Redis安全加固策略:服务账号管理 开启redis密码认证 开启防护模式

Redis安全加固策略&#xff1a;服务账号管理 & 开启redis密码认证 & 开启防护模式 1.1 服务账号管理1.1.1 检测方法1.1.2 加固参考配置操作 1.2 开启redis密码认证1.2.1 检测方法1.2.2 加固参考配置操作 1.3 开启防护模式1.3.1 检测方法1.3.2 加固参考配置操作 &#x…

静态时序分析:SDC约束命令set_case_analysis详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定值 指定端口/引脚列表 简单使用 set_case_analysis命令用于对电路进行特定模式的设定&#xff0c;例如对于一个工作在正常模式下的芯片&#xff0c;…

Springboot 项目读取yaml的配置文件信息给静态方法使用,以及通过配置 ResourceBundle 类读取config.properties

读取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 创建一个类 ProxyProperties 读取配置文件信息&#xff0c;并对外提供get方法 …

零基础如何快速入门伦敦金交易

伦敦金交易是金融市场中备受关注的一种投资方式。对于想要学习如何炒伦敦金并快速开始交易的人来说&#xff0c;本文将为您提供一份全面而详细的指南。无论您是初学者还是有经验的交易者&#xff0c;本文都将帮助您了解伦敦金交易的基本知识&#xff0c;并提供一些实用的技巧和…

linux环境安装cuda toolkit

1 全新安装 如果环境中没安装过cuda版本&#xff0c; 这种情况下比较简单。 直接在https://developer.nvidia.com/cuda-toolkit-archive选择对应版本下载安装即可。 如下为安装cuda toolkit 11.8. 2 环境中已经存在其他版本 这种情况下比较复杂一些。 首先要确认最高支持的…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2402.18293 源码…

06 OpenCV增加图像的对比度

文章目录 理论API代码 理论 图像变换可以看作如下&#xff1a; 像素变换 – 点操作邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 API saturate_cast(value)确保值大小范围为0~255之间Mat.at(y,x)[index]value 给每个像素点每个通道赋值 代码 #include <…

学习:吴恩达:什么是神经元?神经网络如何工作?

学习-吴恩达《AI for everyone》2019 深度学习非技术解释 第2部分 可选.zh_哔哩哔哩_bilibili 深度学习Deep learning 人工神经网络Artificial Neural network 什么是神经网络&#xff1f; 只有一个神经元 4个神经元的神经网络 神经网路的绝妙之处 神经网路的绝妙之处就在…

matplotlib从起点出发(14)_Tutorial_imshow_origin_extent

0 总述 imshow()允许你将图像&#xff08;将进行颜色映射——基于norm和cmap——的2D数组或将按原样使用的3D RGB(A)的数组&#xff09;渲染到数据空间中的矩形区域。最终渲染中图像的方向由原点和范围关键字参数&#xff08;以及生成的AxesImage实例上的属性&#xff09;和Ax…

GVIM常见命令

一、模式之间的切换 二、退出保存 &#xff1a;q 不保存就退出vim &#xff1a;w 保存但不退出vim &#xff1a;wq 保存并退出vim 三、打开侧边栏 如下所示&#xff1a; 在命令模式下输入vt打开侧边栏目录&#xff0c;输入r更新目录 四、光标的移动 不仅是括号&#xff0c;b…

19. 学习人工智能如何从阅读论文中获取一手信息,并推荐一些技术论文

本文为 「茶桁的 AI 秘籍 - BI 篇 第 19 篇」 文章目录 Hi&#xff0c;你好。我是茶桁。 上节课给大家预告了&#xff0c;今天这节课咱们来看一篇论文。我们之前几节课中讲解的内容其实是在一些论文里面有使用到的。 我们先看一下论文的内容&#xff0c;讲讲 ALS。 就像我上节…

力扣34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

Problem: 34. 在排序数组中查找元素的第一个和最后一个位置 文章目录 题目描述思路复杂度Code 题目描述 思路 Problem: 二分查找常用解题模板&#xff08;带一道leetcode题目&#xff09; 直接套用上述中的寻找左、右边界的二分查找模板即可 复杂度 时间复杂度: O ( l o g n )…

Shellcode ---> 脚本命令入门

今天来浅讲一下shellcode&#xff0c;开始之前&#xff0c;先来乐一乐&#xff0c;哈哈哈哈哈哈哈哈哈哈哈哈 以下的命令你们都别乱用 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01…

if-else if-else 语句

if-else if -else语句 定义&#xff1a;是多条件分支语句&#xff0c;即根据多个条件来控制程 序执行的流程。 语法格式&#xff1a; if (表达式) { 若干语句 } else if (表达式) { 若干语句 } … … else { 若干语句 }

云轴科技ZStack与华东师范大学共建产教融合基地

近日&#xff0c;上海云轴信息科技有限公司&#xff08;云轴科技ZStack&#xff09;与华东师范大学上海国际首席技术官学院宣布&#xff0c;共同打造产教融合基地&#xff0c;以促进人才培养与产业需求的全方位融合。这一举措旨在深化教育与产业的合作关系&#xff0c;培养更多…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

Unity AI生成全景图制作天空盒

现在的AI很强大。 其中&#xff0c;有这样一个网站&#xff0c;通过输入提示词&#xff0c;选择某种风格就可以为你生成360全景图。 网页链接 一、生成全景图 打开网页后&#xff0c;如图&#xff1a; 勾选&#xff0c;点击CONFIRM。 点击GET STARTED&#xff0c;进入主页。…

JavaScript 基本数据类型的详解

JavaScript的基本数据类型 以下都是JS内置的几种类型 数据类型描述number数字&#xff0c;不区分整数和小数string字符串类型booleantrue 真, false 假undefined表示未定义的值null只有唯一的值 null&#xff0c;表示空值 number 数字类型 JavaScript 中不区分整数和浮点数&…