当前位置: 首页 > news >正文

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

    • 权限系统分类(RBAC)
      • 引言
      • 菜单权限
      • 按钮权限
      • 接口权限
      • 路由权限
    • 菜单权限方案
      • 方案一:菜单与路由分离
      • 方案二:菜单和路由都由后端返回
    • 路由权限控制(如果后端设计菜单后返回的菜单都挂载到路由上)
      • 方案一:初始化即挂载全部路由
      • 方案二:按需挂载路由
    • 按钮权限方案
      • 方案一:使用 `v-if` 判断
      • 方案二:通过自定义指令进行按钮权限判断

权限系统分类(RBAC)

引言

在实际项目开发中,权限管理是一个关键功能,用于控制不同用户对系统资源的访问。权限是对特定资源的访问许可,权限控制的目的是确保用户只能访问到被分配的资源。例如,网站管理员可以对网站数据进行增删改查,而普通用户只能浏览

菜单权限

菜单管理涉及定义和管理应用中的导航菜单。不同的用户角色可能会看到不同的菜单项,从而访问不同的功能模块。

按钮权限

不同的用户角色可能享有不同的操作权限,例如管理员可以增删改查,而普通用户只能查看。

接口权限

接口权限通常采用 JWT 形式进行验证。如果请求未通过验证,服务器会返回 401 状态码,客户端则跳转到登录页面重新登录。登录成功后,客户端会拿到 token 并将其存储起来,通过 axios 请求拦截器在每次请求时携带 token。

路由权限

路由权限控制用户可以访问的页面和路径。

菜单权限方案

方案一:菜单与路由分离

前端组件:

{name: "login",path: "/login",component: () => import("@/pages/Login.vue")
}

全局路由卫生

function hasPermission(router, accessMenu) {if (whiteList.includes(router.path)) {return true;}const menu = Util.getMenuByName(router.name, accessMenu);return !!menu.name;
}Router.beforeEach(async (to, from, next) => {if (getToken()) {const userInfo = store.state.user.userInfo;if (!userInfo.name) {try {await store.dispatch("GetUserInfo"); // 获取用户信息await store.dispatch('updateAccessMenu'); // 更新访问菜单if (to.path === '/login') {next({ name: 'home_index' }); // 如果当前路径是登录页,跳转到首页} else {next({ ...to, replace: true }); // 替换当前路径}} catch (e) {if (whiteList.includes(to.path)) {next(); // 如果路径在白名单中,直接通过} else {next('/login'); // 否则跳转到登录页}}} else {if (to.path === '/login') {next({ name: 'home_index' }); // 如果当前路径是登录页,跳转到首页} else {if (hasPermission(to, store.getters.accessMenu)) {Util.toDefaultPage(store.getters.accessMenu, to, routes, next); // 跳转到默认页面} else {next({ path: '/403', replace: true }); // 没有权限,跳转到403页面}}}} else {if (whiteList.includes(to.path)) {next(); // 如果路径在白名单中,直接通过} else {next('/login'); // 否则跳转到登录页}}const menu = Util.getMenuByName(to.name, store.getters.accessMenu);Util.title(menu.title); // 设置页面标题
});Router.afterEach((to) => {window.scrollTo(0, 0); // 滚动条回到顶部
});

优点:
前后端职责分明,前端负责路由定义,后端负责菜单管理。

缺点:
需要维护菜单与路由的对应关系,增加了复杂性。
每次路由跳转都需要进行权限判断

不推荐!!!!!

方案二:菜单和路由都由后端返回

思路: 由后端设计菜单表进行菜单管理,返回给前端后,由前端进行拼接成路由,然后进行挂载到全局路由上,router.addRouter()方法上。进行加载,
在这里插入图片描述
后端返回菜单json格式

[{name: "home",path: "/",component: "home"},{name: "userinfo",path: "/userinfo",component: "userInfo"}
]

前端处理逻辑

// 将后端菜单数据转换为路由格式
function generateAsyncRouter(menus) {const asyncRoutes = menus.map(menu => {const route = {path: menu.path,name: menu.menuName,meta: {title: menu.menuName,icon: menu.icon},hidden: menu.hidden}// 处理组件if (menu.menuType === 'content') {// 目录类型route.alwaysShow = trueroute.component = Layoutif (menu.children && menu.children.length > 0) {route.children = generateAsyncRouter(menu.children)}} else if (menu.menuType === 'menu') {// 菜单类型,动态加载组件route.component = loadView(menu.path)}// button类型的不需要生成路由return route})// 添加404页面路由asyncRoutes.push({ path: '*', redirect: '/404', hidden: true })

优点:
前后端高度集成,灵活性高。

缺点:
前后端配合要求更高。
每次路由跳转都需要进行权限判断。
推荐这种用法

路由权限控制(如果后端设计菜单后返回的菜单都挂载到路由上)

方案一:初始化即挂载全部路由

const routerMap = [{path: '/permission',component: Layout,redirect: '/permission/index',alwaysShow: true,meta: {title: '权限管理',icon: 'lock',roles: ['admin', 'editor'] // 标记权限},children: [{path: 'page',component: () => import('@/views/permission/page'),name: 'pagePermission',meta: {title: '页面权限',roles: ['admin'] // 标记权限}},{path: 'directive',component: () => import('@/views/permission/directive'),name: 'directivePermission',meta: {title: '指令权限'// 如果没有设置权限标识,意味着这个页面不需要权限}}]}
];

方案二:按需挂载路由

import router from './router';
import store from './store';
import { Message } from 'element-ui';
import NProgress from 'nprogress'; // 进度条
import 'nprogress/nprogress.css'; // 进度条样式
import { getToken } from '@/utils/auth'; // 从 cookie 获取 tokenNProgress.configure({ showSpinner: false }); // 配置进度条function hasPermission(roles, permissionRoles) {if (roles.includes('admin')) return true; // 管理员权限直接通过if (!permissionRoles) return true;return roles.some(role => permissionRoles.includes(role));
}const whiteList = ['/login', '/authredirect']; // 不需要重定向的白名单router.beforeEach((to, from, next) => {NProgress.start(); // 开始进度条if (getToken()) { // 确定是否有 tokenif (to.path === '/login') {next({ path: '/' });NProgress.done(); // 如果当前页面是仪表盘,不会触发 afterEach 钩子,所以手动处理} else {if (store.getters.roles.length === 0) { // 用户信息store.dispatch('GetUserInfo').then(res => { // 获取用户信息const roles = res.data.roles; // 注意:角色必须是一个数组!例如:['editor','develop']store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成路由router.addRoutes(store.getters.addRouters); // 添加路由next({ ...to, replace: true }); // 替换当前路径,防止留下历史记录});}).catch((err) => {store.dispatch('FedLogOut').then(() => {Message.error(err || '验证失败,请重新登录');next({ path: '/' });});});} else {if (hasPermission(store.getters.roles, to.meta.roles)) {next(); // 有权限,继续跳转} else {next({ path: '/401', replace: true, query: { noGoBack: true }}); // 没有权限,跳转到401页面}}}} else {if (whiteList.includes(to.path)) {next(); // 如果路径在白名单中,直接通过} else {next('/login'); // 否则跳转到登录页NProgress.done(); // 如果当前页面是登录页,不会触发 afterEach 钩子,所以手动处理}}
});router.afterEach(() => {NProgress.done(); // 结束进度条
});

这种是我实现的方式
全局路由上,获取到全部菜单,前端进行路由加载
在这里插入图片描述

按钮权限方案

方案一:使用 v-if 判断

优点:

简单直观,易于实现。
缺点:

如果页面较多,每个页面都需要获取用户权限并进行判断,增加复杂性。

方案二:通过自定义指令进行按钮权限判断

自定义指令:

import permissionV from './permission-v';const install = function(Vue) {Vue.directive('permission-v', permissionV)
}if (window.Vue) {window['permission-v'] = permissionVVue.use(install); // eslint-disable-line
}permissionV.install = install
export default permissionV

permission-v.js

import store from '@/store'function checkBtnPermission(el, binding) {const { value } = bindingconst permissions = store.getters && store.getters.userInfo.permissionsif (value && value instanceof Array) {if (value.length > 0) {const permission = valueconst hasPermission = permissions.some(permiss => {return permission.includes(permiss)})if (!hasPermission) {el.parentNode && el.parentNode.removeChild(el)}}} else {throw new Error(`need permissions! Like v-permission="['admin','editor']"`)}
}export default {inserted(el, binding) {checkBtnPermission(el, binding)},update(el, binding) {checkBtnPermission(el, binding)}
}

注册到全局

import permission from '@/directive/permission-v'
// 注册全局指令
Vue.use(permission)
Vue.directive('permission-v', permission)//使用方式 v-permission-v
<el-button v-permission-v="['system:role:add']" type="primary" @click="handleAdd" icon="el-icon-plus">新增角色</el-button>

感兴趣的同学可以关注下,日常更新技术文章和demo示例免费的。
在这里插入图片描述

https://bytecodestudio.site/

在这里插入图片描述
在这里插入图片描述

相关文章:

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制&#xff0c;菜单权限&#xff0c;按钮权限&#xff0c;接口权限&#xff0c;路由权限&#xff0c;操作权限&#xff0c;数据权限实现 权限系统分类&#xff08;RBAC&#xff09;引言菜单权限按钮权限接口权限路由权限 菜单权限方案方案一&#xff1a;菜单…...

多机器人系统的大语言模型:综述

25年2月来自 Drexel 大学的论文“Large Language Models for Multi-Robot Systems: A Survey”。 大语言模型 (LLM) 的快速发展为多机器人系统 (MRS) 开辟新的可能性&#xff0c;从而增强通信、任务规划和人机交互。与传统的单机器人和多智体系统不同&#xff0c;MRS 带来独特…...

如何在 Java 应用中实现数据库的主从复制(读写分离)?请简要描述架构和关键代码实现?

在Java应用中实现数据库主从复制&#xff08;读写分离&#xff09; 一、架构描述 &#xff08;一&#xff09;整体架构 主库&#xff08;Master&#xff09; 负责处理所有的写操作&#xff08;INSERT、UPDATE、DELETE等&#xff09;。它是数据的源头&#xff0c;所有的数据变…...

Redis 数据类型 Hash 哈希

在 Redis 中&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如 key "key"&#xff0c;value { { field1, value1 }, ..., {fieldN, valueN } }&#xff0c;Redis String 和 Hash 类型⼆者的关系可以⽤下图来表⽰。 Hash 数据类型的特点 键值对集合…...

17.推荐系统的在线学习与实时更新

接下来就讲解推荐系统的在线学习与实时更新。推荐系统的在线学习和实时更新是为了使推荐系统能够动态地适应用户行为的变化&#xff0c;保持推荐结果的实时性和相关性。以下是详细的介绍和实现方法。 推荐系统的在线学习与实时更新 在线学习的概念 在线学习&#xff08;Onli…...

网络安全检测思路

对于主机的安全检测&#xff0c;我们通常直接采用nmap或者类似软件进行扫描&#xff0c;然后针对主机操作系统及其 开放端口判断主机的安全程度&#xff0c;这当然是一种方法&#xff0c;但这种方法往往失之粗糙&#xff0c;我仔细考虑了一下&#xff0c;觉 得按下面的流程进行…...

老游戏回顾:SWRacer

竞速类游戏里&#xff0c;我很怀念它。 虽然已经25年过去了。 相比之下&#xff0c;别的游戏真的没法形容。 ---- 是LucasArts制作的一款赛车竞速游戏&#xff1b; 玩家要扮演一名银河旅行者参加各种赛车比赛&#xff0c;赢得奖金&#xff0c;在经历了八个不同星球上的24场…...

MySQL面试题合集

1.MySQL中的数据排序是怎么实现的? 回答重点 排序过程中,如果排序字段命中索引,则利用 索引排序。 反之,使用文件排序。 文件排序中,如果数据量少则在内存中排序, 具体是使用单路排序或者双路排序。 如果数据大则利用磁盘文件进行外部排序,一 般使用归并排序。 知识…...

如何在Java EE中使用标签库?

在Java EE&#xff08;现在称为Jakarta EE&#xff09;中使用标签库&#xff08;Tag Library&#xff09;&#xff0c;主要是通过JSP标准标签库&#xff08;JSTL&#xff09;或自定义标签库来实现的。标签库允许在JSP页面中使用自定义的标签&#xff0c;从而简化页面逻辑、增强…...

第 12 天:行为树(Behavior Tree),让 AI 更智能!

&#x1f3af; 目标&#xff1a; ✅ 理解 Unreal Engine 5 行为树&#xff08;Behavior Tree&#xff09; ✅ 创建行为树&#xff08;BT&#xff09;和黑板&#xff08;Blackboard&#xff09;管理 AI 状态 ✅ 使用任务&#xff08;Task&#xff09;让 AI 巡逻、追踪、攻击玩家…...

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时&#xff0c;前面板的外观和布局至关重要。良好的设计不仅提升用户体验&#xff0c;还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点&#xff1a; 1. 前面板设计原则 交互性&#xff1a;组合相关的输入控件和显示控件&#x…...

自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF

目标 了解词袋模型&#xff08;BoW&#xff09;和 TF-IDF 的概念通过实际示例展示 BoW 和 TF-IDF 如何将文本转换为数值表示详细讲解 Scikit-learn 的实现方法通过代码示例加深理解归纳学习难点&#xff0c;并提供课后练习和讲解 3.1 词袋模型&#xff08;Bag of Words, BoW&a…...

Flappy Bird开发学习记录

概述 为了了解一下Unity的开发过程&#xff0c;或者说感受&#xff1f;先搞简单的练练手。 工具 Unity:2022.3.51f1c1 visual studio 2022 开发过程 项目基本设置 新建2d项目&#xff0c;游戏画面设置为1080*1920&#xff08;9&#xff1a;16&#xff09;。 图片素材设…...

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题&#xff1a;在默认的Visual Studio中&#xff0c;选择单行代码后&#xff0c;按下Ctrl /键会将代码注释掉&#xff0c;但再次按下Ctrl /键时&#xff0c;会进行双重注释&#xff0c;这不是我们想要的。 实现效果&#xff1a;当按下Ctrl /键会将代码注释掉&#xff0c;…...

CTF-WEB: 利用Web消息造成DOM XSS

如果索引中有类似如下代码 <!-- Ads to be inserted here --> <div idads> </div> <script>window.addEventListener(message, function(e) {document.getElementById(ads).innerHTML e.data;}); </script>这行代码的作用是将接收到的消息内容…...

2025 西湖论剑wp

web Rank-l 打开题目环境&#xff1a; 发现一个输入框&#xff0c;看一下他是用上面语言写的 发现是python&#xff0c;很容易想到ssti 密码随便输&#xff0c;发现没有回显 但是输入其他字符会报错 确定为ssti注入 开始构造payload&#xff0c; {{(lipsum|attr(‘global…...

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…...

LVDS接口总结--(5)IDELAY3仿真

仿真参考资料如下&#xff1a; https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...

数据库的基本概念

在当今的信息时代&#xff0c;数据已成为企业乃至整个社会的重要资产。如何有效地存储、管理和利用这些数据成为了技术发展的关键领域之一。数据库系统作为数据管理的核心工具&#xff0c;在软件开发、数据分析等多个方面扮演着不可或缺的角色。本文将带你了解数据库的一些基本…...

Redis性能优化

1.是否使用复杂度过高的命令 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢…...

CCF-CSP第34次认证第二题——矩阵重塑(其二)【需反复思考学习!!!】

第34次认证第二题——矩阵重塑&#xff08;其二&#xff09; 官网题目链接 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 相关文件&#xff1a; 题目目录&#xff08;样例文件&#xff09; 题目背景 矩阵转置操作是将矩阵的行和列交换的过程。在转置过程中&…...

大模型DeepSeek-R1学习

学习路线 机器学习-> 深度学习-> 强化学习-> 深度强化学习 大模型演进分支 微调&#xff1a; SFT 监督学习蒸馏&#xff1a;把大模型作为导师训练小模型RLHF&#xff1a;基于人类反馈的强化学习 PPO 近端策略优化 油门 - 重要性采样 权重 * 打分刹车 - clip 修剪…...

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现&#xff1b;Ribbon负责负载均衡&#xff1b;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作&#xff0c;共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理&#xff1a; 一致性&#xff08;Consistency&#xff09;&am…...

19.4.9 数据库方式操作Excel

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本节所说的操作Excel操作是讲如何把Excel作为数据库来操作。 通过COM来操作Excel操作&#xff0c;请参看第21.2节 在第19.3.4节【…...

《深度LSTM vs 普通LSTM:训练与效果的深度剖析》

在深度学习领域&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;以其出色的处理序列数据能力而备受瞩目。而深度LSTM作为LSTM的扩展形式&#xff0c;与普通LSTM在训练和效果上存在着一些显著的不同。 训练方面 参数数量与计算量&#xff1a;普通LSTM通常只有一层或较少…...

认识一下redis的分布式锁

Redis的分布式锁是一种通过Redis实现的分布式锁机制&#xff0c;用于在分布式系统中确保同一时刻只有一个客户端可以访问某个资源。它通常用于防止多个应用实例在同一时间执行某些特定操作&#xff0c;避免数据的不一致性或竞争条件。 实现分布式锁的基本思路&#xff1a; 1. …...

untiy3D为游戏物体制作简单的动画

1.创建一个物体挂载动画组件Animator 2.创建一个动画控制器 3.动画控制器挂载到Animator组件 4.创建动画窗口>动画 入口默认执行left 执行效果 20250212_151707 脚本控制动画 鼠标点击是切换到动画t using System.Collections; using System.Collections.Generic; usi…...

微服务与网关

什么是网关 背景 单体项目中,前端只用访问指定的一个端口8080,就可以得到任何想要的数据 微服务项目中,ip是不断变化的,端口是多个的 解决方案:网关 网关:就是网络的关口,负责请求的路由、转发、身份校验。 前段还是访问之前的端口8080即可 后端对于前端来说是透明的 网…...

ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用

作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...

Ubuntu轻松部署ToolJet低代码开发平台结合内网穿透远程访问

文章目录 前言1.关于ToolJet2.Docker部署3.简单使用演示4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址 前言 本文主要介绍如何在本地Linux服务器使用Docker部署轻量级开源文件分享系统ToolJet&#xff0c;并结合cpolar内网穿透工具轻松实现跨网络环境远程访问与使用…...

[MySQL]5-MySQL扩展(分片)

随着数据量和用户量增加&#xff0c;MySQL会有读写负载限制。以下是部分解决方案 目录 功能拆分 使用读池拓展读&#xff08;较复杂&#xff09; 排队机制 &#x1f31f;分片拓展写 按业务或职责划分节点或集群 大数据集切分 分片键的选择 多个分片键 跨分片查询 资料…...

如何使用 DeepSeek 帮助自己的工作

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今快速发展的技术领域&#xff0c;人工智能&#xff08;AI&#xff09;工具已经成为提高工作效率、促进创新的重要助手。DeepSeek作为一款先进的AI解决方案&#xff0c;为用户提供了强大的数据处理、分析以及预测能力&#xff0c;可…...

Redis缓存穿透、击穿和雪崩面试相关问题整理

在互联网公司的面试中&#xff0c;Redis 的缓存穿透、击穿和雪崩是高频考点&#xff0c;尤其在北京的头部互联网公司&#xff08;如字节、阿里、美团、快手等&#xff09;。以下是针对这三个问题的详细解析及常见面试题方向&#xff1a; 一、缓存穿透&#xff08;Cache Penetra…...

Flink之Watermark

Apache Flink 是一个分布式流处理框架&#xff0c;它非常擅长处理实时数据流。流处理中的一个关键挑战是事件时间的处理&#xff0c;因为在流式数据中&#xff0c;事件到达系统的顺序可能并不代表它们的实际发生时间。为了解决这一问题&#xff0c;Flink 引入了**Watermark&…...

vs构建网络安全系统 网络安全和网络搭建

网站的组成和搭建 网站由服务器&#xff0c;容器&#xff0c;脚本&#xff0c;数据库组成。 服务器和家庭电脑一样。 容器又为环境或服务&#xff1a;apache&#xff0c;lls&#xff0c;tomcat&#xff0c;nginx等 脚本&#xff1a;php&#xff0c;aspx&#xff0c;asp&#x…...

缓存穿透问题及解决方案

一、什么是缓存穿透&#xff1f; 在分布式系统中&#xff0c;缓存常常用于提高系统的性能&#xff0c;减轻数据库的压力。缓存穿透问题指的是请求的数据在缓存和数据库中都不存在&#xff0c;导致请求每次都直接查询数据库&#xff0c;无法从缓存中获取数据&#xff0c;从而绕…...

ElementUI el-popover弹框背景色设置

1.el-popover样式由于使用了 absolute 属性&#xff0c;导致脱离了节点&#xff0c;所以在父级元素使用class无法进行权重处理来修改其样式&#xff0c;解决方式如下&#xff1a;通过popper-class实现样式处理&#xff0c;避免全局样式污染 // html <el-popoverplacement&q…...

在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2

文章目录 1. 安装 nvm&#xff08;如果还没有安装的话&#xff09;2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本&#xff08;远程&#xff09;&#xff1a;4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…...

spring集成activiti流程引擎(源码)

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;请假审批demo从流程绘制到审批结束实例。 源码获取&#xff1a;本文末个人名片直接获取。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行…...

VLLM历次会议(2024.4)

Prefix Caching。预先算好KV cache&#xff0c;遇见公共前缀&#xff0c;复用之&#xff0c;避免再计算一遍。 场景&#xff1a;1. 多轮对话。2.公共的system prompt。 Guided Decoding(格式化输出) 通过Outlines工具实现。 支持正则表达式、JSON格式等。 输入&#xff1a;…...

基于 Docker 搭建 Elasticsearch + Kibana 环境

一、Elasticsearch 1. 下载镜像 elasticsearch镜像不支持latest标签&#xff0c;必须指定版本号 % docker pull elasticsearch:8.17.2 2. 启动容器 参考官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html % docker run -p 9200:9200 -p 9…...

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南 文章目录 在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南一、引言二、下载前的准备2.1 确认系统架构2.2 注册 Oracle 账号 三、从 Oracle 官方下载 Java 8 for ARM643.1 访问 Oracle Java 存档页面3.2 选择合适的版本…...

策略模式-小结

总结一下看到的策略模式&#xff1a; A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3&#xff0c;实现上面的接口。 C:一个环境类&#xff08;或者上下文类&#xff09;&#xff0c;形式可以是&#xff1a;工厂模式&#xff0c;构造器注入模式&#xff0c;枚举模式。 …...

记一次Self XSS+CSRF组合利用

视频教程在我主页简介或专栏里 &#xff08;不懂都可以来问我 专栏找我哦&#xff09; 目录&#xff1a;  确认 XSS 漏洞 确认 CSRF 漏洞 这个漏洞是我在应用程序的订阅表单中发现的一个 XSS 漏洞&#xff0c;只能通过 POST 请求进行利用。通常情况下&#xff0c;基于 POST 的…...

VSCode + Continue 实现AI编程助理

安装VS Code 直接官网下载安装&#xff0c;反正是免费的。 安装VS插件Continue 直接在插件市场中搜索&#xff0c; Continue&#xff0c;第一个就是了。 配置Chat Model 点击Add Chat model后进行选择&#xff1a; 选择Ollama后&#xff0c;需要点击下面的config file : 由于…...

使用Typescript开发Babylon.js的Vue3模板参考

main.js文件 // main.ts import { createApp } from vue import App from ./App.vuecreateApp(App).mount(#app) App.vue文件 <!-- App.vue --> <template><div class"app-container"><BabylonScene /></div> </template><…...

STM32+Proteus+DS18B20数码管仿真实验

1. 实验准备 硬件方面&#xff1a; 了解 STM32 单片机的基本原理和使用方法&#xff0c;本实验可选用常见的 STM32F103 系列。熟悉 DS18B20 温度传感器的工作原理和通信协议&#xff08;单总线协议&#xff09;。数码管可选用共阴极或共阳极数码管&#xff0c;用于显示温度值。…...

DeepSeek自然语言处理(NLP)基础与实践

自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,专注于让计算机理解、生成和处理人类语言。NLP技术广泛应用于机器翻译、情感分析、文本分类、问答系统等场景。DeepSeek提供了强大的工具和API,帮助我们高效地构建和训练NLP模型。本文将详细介…...

Baklib优化数字化内容管理用科技提升商业效率与增值潜力

内容概要 在当今数字化迅速发展的时代&#xff0c;数字化内容管理已成为企业提升竞争力的重要手段。Baklib作为一款强大的智能优化内容管理系统&#xff0c;通过先进的科技手段&#xff0c;帮助企业在内容管理和数据整合方面实现高效运作。Baklib 是什么类型的工具&#xff0c…...

视频基础操作

1.1. 例子 读取mp4格式的视频&#xff0c;将每一帧改为灰度图&#xff0c;并且打上水印&#xff08;“WaterMark”&#xff09;,并将其输出保存为out.mp4&#xff0c;在这个例子中可以看到视频读取&#xff0c;每帧数据处理&#xff0c;视频保存的整体流程简单示例 import cv…...