首页导航跳转功能深度解析-系统内和系统外

首页导航跳转功能分析

一、露天积水矿坑跳转

1.1 入口定义

vue 复制代码
<!-- src/views/homepage/homepage.vue -->
<div class="menu-item" @click="gotoopenPitStopeArrangement(1064)">
  露天积水矿坑
</div>

1.2 跳转实现

javascript 复制代码
// src/views/homepage/homepage.vue - gotoopenPitStopeArrangement
gotoopenPitStopeArrangement(command) {
  // 1. 权限检查:验证是否有权限访问积水矿坑模块
  if (!this.waterStagnantPit) {
    this.$message({
      type: 'error',
      message: '您没有权限访问',
    });
    return;
  }
  
  // 2. Token 验证
  let token = localStorage.getItem('token');
  if (!token) {
    // Token不存在,跳转登录页
    this.$router.replace('/login');
    return;
  }
  
  // 3. 构造跳转URL
  let url = $g.webUrl + '/consult/Home?menu=' + command + '&token=' + token;
  
  // 4. 打开新窗口
  try {
    let newWindow = window.open(url, '_blank');
    // 检查新窗口是否成功打开(防止弹窗拦截)
    if (!newWindow) {
      throw new Error('无法打开新窗口。');
    }
  } catch (e) {
    // 处理弹窗被拦截的情况(静默处理)
  }
}

1.3 权限控制

权限状态来源:

javascript 复制代码
data() {
  return {
    // 能否进入积水矿坑
    waterStagnantPit: false
  };
}

权限获取时机: 在组件初始化时通过 API 获取用户权限,设置 waterStagnantPit 字段。

1.4 跳转流程

复制代码
用户点击"露天积水矿坑"
    ↓
检查 waterStagnantPit 权限
    ↓
├── 无权限 → 提示"您没有权限访问"
└── 有权限 → 继续
    ↓
检查 localStorage 中的 token
    ↓
├── token不存在 → 跳转登录页
└── token存在 → 继续
    ↓
构造 URL: $g.webUrl + '/consult/Home?menu=1064&token=xxx'
    ↓
window.open(url, '_blank') 打开新窗口

二、智能监控跳转

2.1 入口定义

vue 复制代码
<!-- src/views/homepage/homepage.vue -->
<el-popover placement="bottom" trigger="hover">
  <span slot="reference">智能监控</span>
  <div class="mouse_wrap">
    <span @click="gotorealTimeMonitoring(576)">电量监控</span>
    <span @click="gotorealTimeMonitoring(0)">视频监控</span>
  </div>
</el-popover>

2.2 跳转实现

javascript 复制代码
// src/views/homepage/homepage.vue - gotorealTimeMonitoring
gotorealTimeMonitoring(command) {
  // 1. Token 验证
  let token = localStorage.getItem('token');
  if (!token) {
    this.$router.replace('/login');
    return;
  }
  
  // 2. 特殊处理:电子围栏监控需要生成 JWT Token
  let Jwttoken = null;
  if (command === 'dzwl') {
    const adcode = localStorage.getItem('adcode');
    const jwt = require('jsonwebtoken');
    
    // JWT Header
    const header = { alg: 'HS256', typ: 'JWT' };
    
    // JWT Payload
    const payload = {
      code: adcode,           // 行政区编码
      userName: this.nickName, // 用户昵称
      userLevel: this.regionLevel // 用户级别
    };
    
    // 生成 JWT Token
    const secret = 'secretKey';
    Jwttoken = jwt.sign(payload, secret, {
      algorithm: 'HS256',
      header: header
    });
  }
  
  // 3. 命令映射表
  const commandMap = {
    0: { 
      type: 'route', 
      path: '/videoSurveillance/realTimeMonitoring' 
    },
    576: {
      type: 'url',
      url: `${$g.webUrl}/consult/consultHome?menu=576&token=${token}`
    },
    709: {
      type: 'url',
      url: `${$g.webUrl}/consult/consultHome?menu=${command}&token=${token}`
    },
    757: {
      type: 'url',
      url: `${$g.webUrl}/consult/consultHome?menu=${command}&token=${token}`
    },
    dzwl: {
      type: 'url',
      url: `http://ip:port/home?token=${Jwttoken}`
    },
    tssd: {
      type: 'url',
      url: `http://xxxx`
    }
  };
  
  // 4. 执行跳转
  const commandInfo = commandMap[command];
  if (commandInfo) {
    if (commandInfo.type === 'route') {
      // Vue Router 路由跳转(新窗口)
      const routeUrl = this.$router.resolve({ path: commandInfo.path });
      window.open(routeUrl.href, '_blank');
    } else if (commandInfo.type === 'url') {
      // 外部 URL 跳转
      window.open(commandInfo.url, '_blank');
    }
  } else {
    this.$message.warning('此模块正在开发中');
  }
}

2.3 命令映射表

命令参数 功能名称 跳转类型 目标地址
0 视频监控 route /videoSurveillance/realTimeMonitoring
576 电量监控 url $g.webUrl/consult/consultHome?menu=576&token=xxx
'dzwl' 电子围栏监控 url http://ip:port/home?token=JWT

2.4 JWT Token 生成(电子围栏专用)

javascript 复制代码
// 仅 command === 'dzwl' 时执行
const jwt = require('jsonwebtoken');

const header = { alg: 'HS256', typ: 'JWT' };
const payload = {
  code: adcode,           // 行政区编码
  userName: this.nickName,
  userLevel: this.regionLevel
};
const secret = 'secretKey';

Jwttoken = jwt.sign(payload, secret, {
  algorithm: 'HS256',
  header: header
});

2.5 权限控制(唐山市试点)

vue 复制代码
<span v-show="authorizationServices.tsssd" @click="gotorealTimeMonitoring('tssd')">
  唐山市试点
</span>

通过 authorizationServices.tsssd 控制是否显示该菜单。

2.6 跳转流程

复制代码
用户点击智能监控子菜单
    ↓
检查 localStorage 中的 token
    ↓
├── token不存在 → 跳转登录页
└── token存在 → 继续
    ↓
判断命令类型
    ↓
├── command === 'dzwl' → 生成 JWT Token
└── 其他 → 直接使用原有 token
    ↓
查询 commandMap 获取跳转信息
    ↓
├── type === 'route' → Vue Router 解析路径 → window.open
├── type === 'url' → 直接 window.open
└── 无匹配 → 提示"此模块正在开发中"

三、两种跳转方式对比

3.1 Route 跳转(Vue Router)

javascript 复制代码
const routeUrl = this.$router.resolve({ path: commandInfo.path });
window.open(routeUrl.href, '_blank');

特点:

  • 使用 Vue Router 解析路径
  • 在当前项目内跳转
  • 可以共享 Vue 实例和状态
  • 适用于项目内部路由

3.2 URL 跳转(外部系统)

javascript 复制代码
window.open(commandInfo.url, '_blank');

特点:

  • 直接打开外部 URL
  • 无法共享状态
  • 需要通过 URL 参数传递认证信息(token)
  • 适用于外部系统或子系统

四、Token 传递机制

4.1 普通 Token 传递

javascript 复制代码
let token = localStorage.getItem('token');
let url = $g.webUrl + '/consult/Home?menu=' + command + '&token=' + token;

4.2 JWT Token 传递(电子围栏专用)

javascript 复制代码
// 生成 JWT
const payload = { code, userName, userLevel };
Jwttoken = jwt.sign(payload, 'secretKey', { algorithm: 'HS256' });

// 传递
url: `http://121.28.213.186:8893/home?token=${Jwttoken}`

五、安全考虑

5.1 Token 验证

所有跳转前都会检查 Token 是否存在:

javascript 复制代码
let token = localStorage.getItem('token');
if (!token) {
  this.$router.replace('/login');
  return;
}

5.2 权限检查

  • 露天积水矿坑 :检查 waterStagnantPit 权限标志
  • 唐山市试点 :检查 authorizationServices.tsssd 权限标志

5.3 弹窗拦截处理

javascript 复制代码
try {
  let newWindow = window.open(url, '_blank');
  if (!newWindow) {
    throw new Error('无法打开新窗口。');
  }
} catch (e) {
  // 静默处理,避免影响用户体验
}
相关推荐
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny10 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹10 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny10 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn11 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker11 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜12 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康12 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木12 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒14 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端