react-bn-面试

1.主要内容

工作台待办

在这里插入图片描述
在这里插入图片描述
实现思路:

1,待办list由后端返回,固定需要的字段有id(查详细)、type(本条待办的类型),还可能需要时间,状态等
2,一个集中处理待办中转路由页,所有待办都跳转到这个页面然后用逻辑控制显示内容
3,动态待办子页面单独处理需要的逻辑
4,每次改变type的值都在redux中取
5,所有跟type相关的组件都做成一个配置文件,方便后续添加新组件

代码:
在这里插入图片描述

const toDoTask=(item)=>{console.log(item);const isComp=type2Comp[item.type]console.log(isComp);dispatch(setDyComp(item.type))if(isComp){//跳转路由navigate(`/todo/${item.id}`)}else{console.error(`Unknown type: ${item.type}`);}
}

中转页核心代码:

function withDynamicComponent(Component, parentProps) {if (!Component) {return <div>Component not found</div>;}return (<React.Suspense fallback={<div>Loading...</div>}><Component props={parentProps} /></React.Suspense>);
}

type配置:

import Tax from '../tax/index'
import Apply from '../apply/index'
import Mail from '../mail/index'
import Text from '../text/index'
export const type2Comp = {tax: Tax,mail: Mail,text: Text,apply: Apply,// 增加一个路由就增加一个配置组件//这里还应该考虑一个type 可能有多个子页面,这种情况可以在子页面通过status再写子页面,类似树结构};

动态子组件

function Apply({props}) {return <div>apply<div>{props.name}</div><div>{props.id}</div></div>;}export default Apply;

登录

Cookie + Session 登录
Token 登录
SSO 单点登录

相关资料:https://blog.csdn.net/beekim/article/details/135130179

权限管理

1.接口权限(登录后存token,通过axios请求拦截器进行拦截,每次请求的时候头部携带token)
2.路由权限\菜单权限:a.路由的name、path、component统一存在后端,由后端返回。配置信息也可以提供界面统一管理。b.后端返回后,路由通过addRoute动态挂载,将component字段换为真正的组件(注意vite项目:import.meta.glob)c.将菜单和路由存在vuex/pinia实时变更页面3.按钮权限a.在登录的时候拉取按钮权限编码code['EXPORT_LIST','OPEN_MODAL']b.将编码缓存本地c.页面通过v-if控制按钮或是自义定指令控制按钮extra:
前端控制权限
//1.在路由配置中配置白名单
{name: "Login",path: "/login",component: () => import("@/views/Login.vue"),meta:{whiteList:['admin','tom']}},//2.在路由守卫beforeEach中判断当前用户角色是否在meta中,是就next()

正式的项目中,权限管理一般都是在后台维护的,也就是用户登录后,从接口获取该用户权限信息(菜单权限,按钮权限等)。要实现该功能,前端项目得提供基础功能用于维护,功能如下:

必备:
1,用户管理
简介:用户基础信息2,角色管理
简介:配置每个用户的角色,一个用户可以有多个角色
作用:
a,可以在给每个角色配置上他能看到的菜单
b,后台可以根据角色来控制列表的数据权限,列表根绝相应的角色和部门信息返回不同的值
c,按钮权限控制也是要通过角色来配置3,菜单管理
简介:配置项目中的菜单信息和按钮权限
参数:
*菜单类型:一级菜单、子菜单、按钮权限
*菜单名称:xxx
*访问路径:xxx(path)
*前端组件:xxx(component/element的位置)
其他参数:角色、图标、序号等注:
type为子菜单时要显示父级菜单。
type按钮权限时要配置权限的编码code,方便使用时匹配对应的权限其他:
部门管理
数据字典
分类字典

在项目中具体怎么使用?

1,获取菜单后怎么渲染?
2,怎么控制按钮权限?

1,获取菜单后怎么渲染?

通过接口返回后,就前端代码只需要写一个公共方法处理返回的data->项目能识别的路由

怎么识别?

import React, { Suspense } from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';// 模拟从接口返回的字符串
const getElementFromApi = async () => {// 假设接口返回的字符串是组件的路径return 'pages/Home'; // 例如:'pages/Home'
};// 动态导入组件的函数
const loadComponent = async (componentPath) => {try {const { default: Component } = await import(`./${componentPath}`);return Component;} catch (error) {console.error('Error loading component:', error);return null;}
};const App = () => {const [routes, setRoutes] = React.useState([]);React.useEffect(() => {const fetchRoutes = async () => {const elementPath = await getElementFromApi();const Component = await loadComponent(elementPath);if (Component) {setRoutes([{path: '/',element: <Component />,},]);}};fetchRoutes();}, []);return (<Router><Suspense fallback={<div>Loading...</div>}><Routes>{routes.map((route, index) => (<Route key={index} path={route.path} element={route.element} />))}</Routes></Suspense></Router>);
};export default App;

2,怎么控制按钮权限?

写一个hooks接受按钮权限编码code
a,在hooks查接口判断有没有权限
b,在登录时查询所有按钮权限编码['EXPORT_LIST','OPEN_MODAL'],缓存在本地,然后再在hooks去查本地有没有权限

文件上传

普通的文件上传

核心部分:
//创建流式读取器
const reader=new FileReader();
reader.readAsDataURL(this.files[0])//input读取完成后自动执行onload函数reader.onload=function(e){preview.src=e.target.resultconsole.log(e.target.result);//读取完成后将e.target.result传给服务器//ajax....
}const formData = new FormData();
formData.append('BizType', props.bizType);//设置文件类型(合同材料,)
formData.append('file', resultFile);//文件
formData.append('businessId', props.businessId);//其他参数const temp: any = await useUpLoadingUrl(fileParam.value);上传成功后,会返回对应文件的下载地址用于回显注意:这里没有考虑大文件上传,后台限制文件最大为50M

大文件上传(分片):

  <input type="file" id="fileInput" /><button id="uploadButton">上传</button><div id="progress"></div><script>
document.getElementById('uploadButton').addEventListener('click', async () => {const fileInput = document.getElementById('fileInput') as HTMLInputElement;const file = fileInput.files?.[0];if (!file) {alert('请选择一个文件');return;}const chunkSize = 1024 * 1024; // 每个分片的大小,1MBconst totalChunks = Math.ceil(file.size / chunkSize);const uploadProgress = document.getElementById('progress') as HTMLDivElement;for (let i = 0; i < totalChunks; i++) {const start = i * chunkSize;const end = Math.min(start + chunkSize, file.size);const chunk = file.slice(start, end);const formData = new FormData();formData.append('file', chunk, file.name);formData.append('chunkIndex', i.toString());formData.append('totalChunks', totalChunks.toString());try {const response = await fetch('/upload', {method: 'POST',body: formData,});if (!response.ok) {throw new Error('上传失败');}const progress = ((i + 1) / totalChunks * 100).toFixed(2);uploadProgress.innerText = `上传进度: ${progress}%`;} catch (error) {console.error('上传出错:', error);alert('上传失败');return;}}alert('上传完成');
});
</script>

改造?
老的文件上传所有文件存在阿里云上的,后续的投标时,需要批量下载投标材料,阿里云上无法确认文件的准确性。
改造后将所有上传的文件分类(身份证信息,毕业证信息等),存在公司自己的nas盘方便集中管理

如果文件为图片,后台有限制不能超过固定宽高,不同手机拍的照片上传后会有翻转的情况限制宽高:
exif.js插件获取到旋转参数
判断图片方向,重置canvas大小,确定旋转角度,
image.onload里面获取图片宽高,判断是否满足,不满足的话就就创建canvas裁剪
var canvas = document.createElement('canvas');
var context: any = canvas.getContext('2d');
context.drawImage(image, 0, 0, drawWidth * 0.8, drawHeight);
//返回校正图片
next(canvas.toDataURL(v.file.type));

socket聊天

其他常见场景:
https://vue3js.cn/interview/http/WebSocket.html#%E4%BA%8C%E3%80%81%E7%89%B9%E7%82%B9

项目中用到的:advance-chat+socket.io
难点:
1.替换advance-chat源码中后台的firebase
看了源码,firebase有普通接口请求和ws事件请求两种功能,所以将相关代码拆成两块:普通接口,ws事件。再基于对soket.io的封装对firebase中关于ws事件那一块改写
2.socket.io的封装

1.本地创建了一个简单的node服务
/* 这里就是当客户端socket连接到服务端socket的生命周期 */
io.on("connection", function (socket) {/* io.emit(事件名,参数) */io.emit("message", "恭喜连接成功" );// 接受前台发过来的消息socket.on("sendToServer", (message) => {console.log(message);// 向客户端发送消息// socket.emit("sendToClient", {//   message: "你好我是服务端,让我们来聊天呀",// });});
});/* 指定连接的地址 */this.socket = io('ws://localhost:3333');this.socket.connect();//监听后台给前台发的消息this.socket.on('message', (message) => {console.log('我是客户端,接收到了数据', message);//业务逻辑if (message.type === 'getMsg') {console.log(message.id);this.getAutoChatData(message.roomId);}});//前台给后台发的消息this.socket.emit('sendToServer', {message: '我是客户端,来陪我聊聊',});

更多细节见之前写的文章:
https://blog.csdn.net/beekim/article/details/135130179

几个重要的ws事件:
MessageUpdate 监听房间内的消息
RoomUpdate 监听左侧房间list
LastMessageUpdate 监听最后一条消息
如果ws监听到变化,就在相应的回调函数中更新页面上的数据

加解密

这一块主要看计算机网络方面的非对称加密:

非对称加密是一种加密方法,使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。
公钥可以公开发布,而私钥必须保密。加密过程:发送方使用接收方的公钥对数据进行加密,加密后的数据只能通过接收方的私钥解密。
解密过程:接收方使用自己的私钥对加密数据进行解密,恢复原始数据。

H5-原生相机

需求:在h5做身份证件拍照然后上传
方案:
利用 navigator.mediaDevices.getUserMedia 打开摄像头,将视频流放入 video 标签的 src 中,再通过 canvas.drawImage 的方法,以 video 对象为画布源,绘制最终拍照的图
问题:
1,安卓可以正常用video打开相机,ios有问题,打开时全屏的。
解决方案:

 <video ref="video"  id="video-fix" :width="width" :height="height"autoplay   webkit-playsinline playsinline></video>ios端video标签必须加webkit-playsinline、playsinline属性。
android端部分视频也会存在自动全屏问题,添加webkit-playsinline属性。

2,拍出来的照片默认是640*480 ,照片不清晰
解决方案:

<video ref="video"  id="video-fix" width="1280" height="720" autoplay   webkit-playsinline playsinline></video>
<canvas ref="canvas" style="display: none" width="1280" height="720"></canvas>video宽高要设置成 4:3或16:9才行,这里我设置成了1280*720

3,本地local能打开电脑前置,不是最终效果
localhost 只能调起电脑的前置摄像头,无法在手机本地调试。这是因为浏览器的安全限制,必须使用 https 才可以。所以需要让运维升级测试环境为https。所在在使用后置摄像头调试时非常麻烦,建议将需要调试的参数都设置成变量再逐一调试。

4,部分手机打开相机默认是放大的(手动设置焦距)

5,ios的css样式bug

原因是ios的游览器识别不到video实时的offsetHeight的值,所以在识别不到的时候,手动设置一下遮罩层的高度就可以了。
videoHeight.value=video.value.offsetHeight
if(video.value.offsetHeight<400){//解决ios不能获取到实时的offsetHeight的问题videoHeight.value=600
}

在这里插入图片描述

详细文档:https://blog.csdn.net/beekim/article/details/143680213?spm=1001.2014.3001.5502

H5-pdf文件预览

需求:有一个H5项目要嵌入我们的主项目,嵌入方案是用的iframe,但是在H5项目中需要预览pdf文件,这里再用Iframe就会出问题。
在这里插入图片描述
在多次查找和尝试后解决了预览pdf的问题:
方案:借助pdfjs插件,将pdf文件流/pdf下载链接,传入pdfjs,插件会读取文件并识别出一些文件信息,把pdf转为图片。我们再将图片绘制到cavans上就可以完美解决这个问题了。

核心代码如下:

<template><div ref="showpdfRef"></div>
</template><script setup>
import { ref } from 'vue';
import { getDocument } from 'pdfjs-dist/legacy/build/pdf.mjs';
import 'pdfjs-dist/build/pdf.worker.mjs';const showpdfRef = ref(null);const pdfPath ='xxxxxxxx'const loadingTask = getDocument(pdfPath);
loadingTask.promise.then(async (pdf) => {const canvas = document.createElement('canvas');const context = canvas.getContext('2d');// 循环遍历每一页pdf,将其转成图片for (let i = 1; i <= pdf._pdfInfo.numPages; i++) {// 获取pdf页const page = await pdf.getPage(i);// 获取页的尺寸const viewport = page.getViewport({ scale: 1 });// 设置canvas的尺寸canvas.width = viewport.width;canvas.height = viewport.height;// 将pdf页渲染到canvas上await page.render({ canvasContext: context, viewport: viewport }).promise;// 将canvas转成图片,并添加到页面上const img = document.createElement('img');img.src = canvas.toDataURL('image/png');showpdfRef.value.appendChild(img);}}).then(function () {console.log('# End of Document');},function (err) {console.error('Error: ' + err);},);
</script><style scoped></style>

详细文档:https://blog.csdn.net/beekim/article/details/144857593?spm=1001.2014.3001.5502

3.补充内容

flex

//容器属性
flex-direction
flex-wrap
flex-flow//flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
justify-content
align-items//flex-start、flex-end、center、baseline、stretch
align-content//属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用//项目属性
order//设置顺序
flex-grow//设置放大比例(剩余空间分配比例(默认为0,不扩展))
flex-shrink//宽度不够时设置缩小比列(空间不足时收缩比例(默认为1,可收缩))
flex-basis//项目在分配剩余空间前的初始大小
flex//flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选
align-self//允许单个项目有与其他项目不一样的对齐方式

常见问题:
如何实现水平垂直居中?

.container {display: flex;justify-content: center; /* 主轴居中 */align-items: center;     /* 交叉轴居中 */
}

如何实现「圣杯布局」(Header + Footer + 自适应内容区)?

.container {display: flex;flex-direction: column;min-height: 100vh;
}
.header { height: 60px; }
.content { flex: 1; } /* 占据剩余空间 */
.footer { height: 100px; }

flex-basis 和 width 的优先级

若 flex-direction: row,flex-basis 优先级高于 width若 flex-basis 为 auto,则使用 width 的值例外:min-width/max-width 会限制 flex-basis。

flex-shrink: 0 的作用

禁止项目在空间不足时收缩,常用于固定侧边栏:
.sidebar {flex: 0 0 250px; /* flex-grow:0, flex-shrink:0, flex-basis:250px */
}

为什么设置 flex:1 的项目宽度不一致?
原因:若项目内容长度差异大,且 flex-basis:0(即 flex:1),浏览器会优先按内容比例分配空间。

解决:设置 min-width: 0 或 overflow: hidden 重置内容最小尺寸。
Flex 布局中 margin: auto 的特殊效果
现象:在 Flex 项目中,margin: auto 会吸收剩余空间,实现特定对齐效果。

示例:单个项目右对齐 → margin-left: auto。

line-height:120% 和line-height:1.2区别?

在这里插入图片描述

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

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

相关文章

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息&#xff0c;目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块&#xff1a;进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型

本教程将指导你如何在 Linux 系统上安装 Ollama&#xff08;一个本地运行大型语言模型的工具&#xff09;&#xff0c;并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型&#xff0c;适用于多种自然语言处理任务。 DeepSeek-R1 简介 DeepSeek-R1 是 DeepSeek …

Ubuntu 安装 QGIS LTR 3.34

QGIS官方提供了安装指南&#xff1a;https://qgis.org/resources/installation-guide/#linux。大多数linux发行版将QGIS拆分为几个包&#xff1a;qgis、qgis-python、qgis-grass、qgis-plugin-grass、qgis-server&#xff0c;有的包最初安装时被跳过&#xff0c;可以在需要使用…

Visio2021下载与安装教程

这里写目录标题 软件下载软件介绍安装步骤 软件下载 软件名称&#xff1a;Visio2021软件语言&#xff1a;简体中文软件大小&#xff1a;4.28G系统要求&#xff1a;Windows10或更高&#xff0c;64位操作系统硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高下载链接&#…

c++贪心

本篇文章&#xff0c;我将同大家一起学习c的贪心&#xff01;&#xff01;&#xff01; 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解…

活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!

Code Without Barriers 上海活动回顾 Code Without Barriers&#xff1a;AI & DATA 深入探索人工智能与数据如何变革行业 2025年1月16日&#xff0c;微软开发者社区 Code Without Barriers &#xff08;CWB&#xff09;携手 She Rewires 她原力在大中华区的首场活动“AI &…

嵌入式C语言:结构体的多态性之结构体中的void*万能指针

目录 一、void*指针在结构体中的应用 二、实现方式 2.1. 定义通用结构体 2.2. 定义具体结构体 2.3. 初始化和使用 三、应用场景 3.1. 内存管理函数 3.2. 泛型数据结构&#xff08;链表&#xff09; 3.3. 回调函数和函数指针 3.4. 跨语言调用或API接口&#xff08;模拟…

NoteGen:记录、写作与AI融合的跨端笔记应用

在信息爆炸的时代,如何高效地捕捉灵感、整理知识并进行创作成为了许多人关注的问题。为此,我们开发了 NoteGen,一款专注于记录和写作的跨端 AI 笔记应用。它基于 Tauri 开发,利用其强大的跨平台能力支持 Mac、Windows 和 Linux 系统,并计划未来扩展到 iOS 和 Android 平台…

BUUCTF 蜘蛛侠呀 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki Hello CTF NewStar CTF buuctf-蜘蛛侠呀 BUUCTF&#xff1a;蜘蛛侠呀 MISC&#xff08;时间隐写&#xff09;蜘蛛侠呀 题目描述&am…

Web3 的核心理念:去中心化如何重塑互联网

Web3 是新一代互联网的构想&#xff0c;它的核心理念是去中心化&#xff0c;旨在打破传统互联网由大型平台主导的数据垄断&#xff0c;赋予用户更多的控制权和隐私保护。通过区块链技术和去中心化应用&#xff08;DApps&#xff09;&#xff0c;Web3 正在重塑互联网的运作方式。…

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…

C++封装红黑树实现mymap和myset和模拟实现详解

文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…

服务器虚拟化技术详解与实战:架构、部署与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在现代 IT 基础架构中&#xff0c;服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…

Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)(前三题)

A. String 翻译&#xff1a; 给你一个长度为 n 的字符串 s&#xff0c;其中包含 0 和/或 1。在一次操作中&#xff0c;您可以从 s 中选择一个非空的子序列 t&#xff0c;使得 t 中任何两个相邻的字符都是不同的。然后&#xff0c;翻转 t 中的每个字符&#xff08;0 变为 1&…

图漾Halcon版本SDK使用教程【V1.1.0新版本】

1.下载并安装 Halcon 1.1 下载Halcon软件 在 Halcon 官网(https://www.mvtec.com/downloads) 下载 Halcon (Windows 版) 安装包&#xff0c;并根据官方文档安装 Halcon&#xff0c;下载HALCON24.11Progress-Steady。 1.2 安装Halcon 1.解压HALCON 24.11.1.0的安装包压缩文件…

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

Android实训九 数据存储和访问

实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储&#xff0c; 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面&#xff0c;实现以下功能&#xff1a; 1&#xff…

python3+TensorFlow 2.x(三)手写数字识别

目录 代码实现 模型解析&#xff1a; 1、加载 MNIST 数据集&#xff1a; 2、数据预处理&#xff1a; 3、构建神经网络模型&#xff1a; 4、编译模型&#xff1a; 5、训练模型&#xff1a; 6、评估模型&#xff1a; 7、预测和可视化结果&#xff1a; 输出结果&#xff…

Queries Acceleration -Tuning- Tuning Execution 学习笔记

1 Adjustment of RuntimeFilter Wait Time 1.1 Case: Too Short RuntimeFilter Wait Time 1.1.1 没有看懂,好像是等待时间过小也会导致性能下降 1.1.2 set runtime_filter_wait_time_ms = 3000; 2 Data Skew Handling 2.1 Case 1: Bucket Data Skew Leading to Suboptimal …