项目的纪要
ai客服项目中发现的问题:
可以在控制台看到我们存储的cookie:
![]()

可以看到是这样的,
但是我们通过getCookie方法专门获取这个字段, 然后在控制台打印后
const userName = getCookie('SA_USER_NICK_NAME');
console.log(userName, 'userName');
输出结果是:
ä½ å¥½ä½ å¥½ä½ å¥½ä½ å¥½
然后我们尝试通过decodeURIComponent进行解码:
const userName = getCookie('SA_USER_NICK_NAME');
console.log(userName, 'userName');const decodeResult = decodeURIComponent(userName)
console.log(decodeResult, 'decodeResult')
结果仍然是:
ä½ å¥½ä½ å¥½ä½ å¥½ä½ å¥½ userName
ä½ å¥½ä½ å¥½ä½ å¥½ä½ å¥½ decodeResult
我们尝试了多种方法, 包括使用 encodeURIComponent 方法先转码在解码还是不行,
我们经过调试, 发现是项目中使用的公司自己的getCookie方法的问题导致的, 于是我们自己写了一个getTheCookie方法:
function getTheCookie(name) {// 获取当前页面的所有 cookieconst cookies = document.cookie;// 如果没有 cookie,则返回空字符串if (cookies === '') {return '';}// 查找特定名称的 cookie 值const cookieName = name + '=';const cookieArray = cookies.split(';');for (let i = 0; i < cookieArray.length; i++) {let cookie = cookieArray[i].trim();// 判断是否以指定名称开头if (cookie.indexOf(cookieName) === 0) {// 返回 cookie 值,解码后的return decodeURIComponent(cookie.substring(cookieName.length));}}// 如果没有找到对应的 cookie,则返回空字符串return '';}
通过这个方法, 我们成功在控制台输出了: 存储在cookie中的汉字: 你好你好你好你好
因为这是html文件, 所以不能像vue3那样使用, 下面我们通过原生js获取元素, 使用textContent进行了相应的替换:
const userName = getTheCookie('SA_USER_NICK_NAME');console.log(userName, 'userName');// 使用 querySelector 获取第一个 p 元素并设置其内容const greetingParagraph = document.querySelector('.helpWarp .user dd p');greetingParagraph.textContent = `Hi,${userName}`;// 假设已经获取了最新的用户名并存储在变量 userName 中const onlineUsername = document.querySelector('.shortcut .online dl dt em');onlineUsername.textContent = userName;
上面这样就将浏览器cookie中存储的用户名字, 成功显示在当前页面中了.
后续我们遇到了调用接口已经登录, 但是接口仍然返回600的情况:
我们询问后端同事后, 了解到我们携带的请求头中没有携带所有的cookie,
问:
function getUserInfo() {//获取用户信息$.ajax({url: 'https://xxxx.xxxx.com/api/ucenter/xxxx/xxxx',type: 'GET',contentType: 'application/json;charset=UTF-8',success: function (res) {console.log(res, 'res')if (res.data != "{}") {var getCodeName = res.data.goodsTypeCode}}})}getUserInfo();请求的时候没有携带cookie请问该怎么办才能带上?
回答:
要在 AJAX 请求中携带 cookie,可以使用 xhrFields 属性来设置 withCredentials 为 true。这样,浏览器就会在请求中包含当前域名下的 cookie。修改后的代码如下:function getUserInfo() {//获取用户信息$.ajax({url: 'https://xxxx.xxxx.com/api/ucenter/xxxx/xxxx',type: 'GET',contentType: 'application/json;charset=UTF-8',xhrFields: {withCredentials: true},success: function (res) {console.log(res, 'res')if (res.data.mobile) { $('.popup_online p').text(res.data.mobile)}}})
}
getUserInfo();
在这个例子中,
我们添加了 xhrFields 属性,并将 withCredentials 设置为 true。这样,浏览器就会在请求中包含当前域名下的 cookie。请注意,如果你的请求是跨域的,服务器需要设置 Access-Control-Allow-Credentials 头为 true,才能让浏览器发送包含 cookie 的请求
问:
在html页面中, 要将 <p>XXXXXXXXXXXX@caixin.com</p> 替换为 res.data.mobile 的值怎么做呢?
回答:
function getUserInfo() {//获取用户信息$.ajax({url: 'https://xxxx.xxxx.com/api/ucenter/xxxx/xxxx',type: 'GET',contentType: 'application/json;charset=UTF-8',xhrFields: {withCredentials: true},success: function (res) {console.log(res, 'res')if (res.data.mobile) { $('.popup_online p').text(res.data.mobile)}}})
}
getUserInfo();
问:
进入界判断是否是移动端, 是移动端则展示意见反馈, 非移动端则展示我的奖品
<li class="feedback"><a href="feedback.html"><span><img src="https://xxxx.xxxx.com/xxxx/xxxx/images/xxxx.svg" alt=""></span><p>意见反馈</p></a></li>
回答:
function isMobileOrTablet() {// 使用正则表达式匹配常见的平板设备const tabletRegex = /iPad|Android|webOS|BlackBerry|Windows Phone|Touch/i;// 判断屏幕宽度小于等于 767px 或者是平板设备return window.matchMedia("(max-width: 767px)").matches || tabletRegex.test(navigator.userAgent);}// 页面加载完成后执行window.onload = function () {var pTag = document.querySelector('.feedback p');var feedBackA = document.querySelector('.feedback a');if (isMobileOrTablet()) {// 如果是移动设备,执行相关操作console.log('移动设备.');// 意见反馈$('.feedback').click(function () {console.log('点击了意见反馈按钮')window.location.href = 'http://xxxx.xxxx.com/xxxx/2024/xxxx.html';})} else {// 如果不是移动设备,执行其他操作console.log('不是移动设备.');pTag.textContent = '我的奖品';// 更改 <img> 到 <svg>var svgIcon = '<svg width="1.3333333333rem" height="1.3333333333rem" viewBox="0 0 50 50" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>我的奖品</title><g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="画板" transform="translate(-163, 0)"><g id="我的奖品" transform="translate(163, 0)"><circle id="椭圆形" fill="#3B97E7" cx="25" cy="25" r="25"></circle><path d="M26.3628287,24.5532515 L26.3628287,38 L32.3738613,38 C35.035922,38 37.2159251,35.8198481 37.2159251,33.1579362 L37.2159251,24.5532515 L26.3628287,24.5532515 Z M13.4485146,24.5532515 L13.4485146,33.1579362 C13.4485146,35.8198481 15.6287037,38 18.2905784,38 L24.2987111,38 L24.2987111,24.5532515 L13.4485146,24.5532515 Z M32.9241415,15.6333296 C33.7151901,14.6220723 32.1655869,12.5222261 30.5030352,13.2955778 C28.9117549,14.0450979 27.7666175,15.2615438 26.7792288,16.4631555 C27.6298003,16.5375127 28.492492,16.5553584 29.3490493,16.5136812 C30.3900495,16.4721527 32.3143013,16.4006955 32.9241415,15.6333296 L32.9241415,15.6333296 Z M20.3696789,13.3193721 C19.2214928,12.8672805 18.5493785,13.352052 18.064607,14.152135 C17.7998583,14.6042266 17.5202754,15.2050324 17.9397242,15.6423269 C19.0431472,16.7784299 22.073945,16.6952242 24.1083196,16.4840499 C23.1447252,15.2883868 21.9667591,13.9499579 20.3696789,13.3193721 L20.3696789,13.3193721 Z M26.3538315,17.5458329 L24.2837282,17.5458329 L24.2837282,23.4646255 L12,23.4646255 L12,18.7147646 C12,17.9652445 12.5977572,17.3673386 13.350326,17.3673386 L18.9478957,17.3673386 C17.4428696,17.0551129 16.3186637,16.4096927 16.2740866,15.2199782 C16.2324094,13.8220264 17.8117555,11.5586317 20.1137787,12.0760832 C22.4932078,12.6115291 24.1559454,14.4526123 25.4288656,16.0289097 C26.7138688,14.4228323 28.5340205,12.3496804 31.0146497,12.0226204 C33.0907015,11.7607717 34.8038161,13.8308749 34.5837933,15.1990838 C34.3963017,16.3977956 33.2483015,17.0491643 31.781904,17.3644386 L37.3081652,17.3644386 C38.0576853,17.3644386 38.6584912,17.9652445 38.6584912,18.711716 L38.6584912,23.4617256 L26.3807116,23.4617256 L26.3538315,17.5458329 Z" id="Fill-1" fill="#FFFFFF"></path></g></g></g></svg>';// 替换 <img> 为 <svg>$('.feedback img').replaceWith(svgIcon);// 我的奖品$('.feedback').click(function () {console.log('点击了我的奖品按钮')feedBackA.href = 'https://u.xxxx.com/xxxx/xxxx';})}};
这样就实现了, 进入界面自动识别是移动端还是电脑端, 根据判断展示对应的图片和文字, 同时点击对应按钮跳转链接也会不同.
问:
window.onload进入后, 会自动判断用户设备室移动端还是非移动端, name会自动执行
// 意见反馈$('.feedback').click(function () {console.log('点击了意见反馈按钮')window.location.href = 'http://xxxx.xxxx.com/xxxx/2024/xxxx.html';})
$('.feedback')函数中的内容吗?
回答:
不会, 只有当用户点击.feedback元素的时候才会执行.feedback函数里的逻辑, 否则只会执行判断用户设备的逻辑, .click函数里面的逻辑不会执行.
相关文章:
项目的纪要
ai客服项目中发现的问题: 可以在控制台看到我们存储的cookie: 可以看到是这样的, 但是我们通过getCookie方法专门获取这个字段, 然后在控制台打印后 const userName getCookie(SA_USER_NICK_NAME); console.log(userName, userName); 输出结果是: 然后我们尝试通过de…...
ubuntu 更新源
前言 实现一键替换在线源 一键更新源 ubuntu 全球镜像站以下支持现有ubuntu 20,22,24 echo "Delete the default source" rm -rf /etc/apt/sources.listecho "Build a new source" cat <<EOF>>/etc/apt/sources.li…...
XGBoost、RF随机森林算法MATLAB实现
% 加载并预处理训练数据 opts1 = detectImportOptions(附件一AE.xlsx, PreserveVariableNames, true); train_data = readtable(附件一AE.xlsx, opts1); train_data.Time = datetime(train_data.time, InputFormat, yyyy-MM-dd HH:mm:ss); % 特征提取和标签准备 windowSize…...
WPF 解决: DataGrid 已定义列,但是还是会显示模型的所有属性的问题
AutoGenerateColumns 属性 AutoGenerateColumns:这个属性决定 DataGrid 是否根据数据源中的属性自动生成列。如果设置为 true,DataGrid 会根据数据源中的属性自动生成列。如果设置为 false,则 DataGrid 不会自动生成列,开发者需要…...
【ai】Easy-RAG : ImportError: cannot import name ‘BaseModel‘ from ‘pydantic‘
[Bug]: cannot import name ‘RootModel’ from ‘pydantic’ #1237 版本不匹配导致 ImportError: cannot import name ‘BaseModel’ from ‘pydantic’ /home/zhangbin/miniconda3/envs/Easy-RAG/bin/python /home/zhangbin/proj/06_rag/02_Easy-RAG/webui.py /home/zhangbi…...
WebKit简介
WebKit是一个开源的浏览器引擎,最初由苹果公司开发,用于Safari浏览器。它是基于KDE项目的KHTML引擎进行开发,并在改进和扩展中形成了WebKit引擎。 WebKit的工作流程可以分为以下几个步骤: 1.解析HTML:当浏览器加载一个…...
笔记 | Python环境下的GUI编程常用包
前言 Python的使用频率和范围越来越大,在一些开发工作中由于需要可视化的图形界面,常常需要进行图形用户界面(Graphic User Interface, GUI)开发。例如,目前最火热的大模型应用,常常是以一个网页界面进行操…...
mysql 数据库空间统计sql
mysql 数据库空间统计 文章目录 mysql 数据库空间统计说明一、数据库存储代码二、查询某个数据库的所有表的 代码总结 说明 INFORMATION_SCHEMA Table Reference 表参考 information_schema是MySQL中的一个特殊数据库,它存储了关于所有其他数据库的元数据信息。…...
【Linux】线程——线程池、线程池的实现、线程安全的线程池、单例模式的概念、饿汉和懒汉模式、互斥锁、条件变量、信号量、自旋锁、读写锁
文章目录 Linux线程7. 线程池7.1 线程池介绍7.2 线程池的实现7.3 线程安全的线程池7.3.1 单例模式的概念7.3.2 饿汉和懒汉模式 8. 常见锁使用汇总8.1 互斥锁(Mutex)8.2 条件变量(Condition Variable)8.3 信号量(Semaph…...
stm32入门-----TIM定时器(PWM输出比较——下)
目录 前言 一、硬件元器件介绍 1.舵机 2.直流电机驱动 二、C语言编程步骤 1.开启时钟 2.配置输出的GPIO口 3.配置时基单元 4.初始化输出比较通道 5.开启定时器 三、实践项目 1.PWM驱动LED呼吸灯 2.PWM驱动舵机 3.PWM驱动直流电机 前言 本期我们就开始去进行TIM定时…...
css实现线条中间高亮,左右两边模糊(linear-gradient的运用)
效果: <div class"line"></div> .line {height: 1px;background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #a9c2ff 50%, rgba(255, 255, 255, 0) 100%);border-radius: 4px 4px 4px 4px; } CSS实现边框底部渐变色的方法:(最简单…...
【数据结构】建堆算法复杂度分析及TOP-K问题
【数据结构】建堆算法复杂度分析及TOP-K问题 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…...
Thinkphp5实现前后端通过接口通讯基本操作方法
在ThinkPHP5框架中,实现前后端通过接口通讯是一个常见的需求,尤其是在开发RESTful API时。下面是一个基本的步骤指南,用于设置ThinkPHP5来创建API接口,并使前端能够通过HTTP请求与后端进行通讯。 1. 创建API模块 首先࿰…...
Go 语言任务编排 WaitGroup
WaitGroup 是常用的 Go 同步原语之一,用来做任务编排。它要解决的就是并发-等待的问题: 现在有一个 goroutine A 在检查点 ( checkpoint ) 等待一组 goroutine 全部完成它们的任务,如果这些 goroutine 还没全部完成任务,那么 goroutine A 就会被阻塞在检查点,直到所有的 …...
星环科技推出知识库产品 AI PC时代数据交互方式变革
随着企业业务的快速发展,数据量呈爆炸式增长,有效的知识管理成为企业面临的重要问题。企业遇到的普遍问题是大量的结构化、半结构化数据存储在不同的系统中,需要用多种计算机语言进行检索。而大模型彻底改变了人们和数据的交互方式࿰…...
10道JVM经典面试题
1、 JVM中,new出来的对象是在哪个区? 2、 说说类加载有哪些步骤? 3、 JMM是什么? 4、 说说JVM内存结构? 5、 MinorGC和FullGC有什么区别? 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出?…...
Redisson常用的数据结构及应用场景
Redisson 提供了一系列高级数据结构,这些数据结构封装了 Redis 的原生数据类型,提供了 Java API 的便利性和分布式特性。以下是 Redisson 中一些常用的数据结构,场景还在不断完善中: RBucket:这是一个简单的键值对存储…...
【实现100个unity特效之8】使用ShaderGraph实现2d贴图中指定部分局部发光效果
最终效果 寒冰法师 火焰法师 文章目录 最终效果寒冰法师火焰法师 素材一、功能分析实现方法基本思路Unity的Bloom后处理为什么关键部位白色?最终结果 二、 新建URP项目三、合并图片四、使用PS制作黑白图片方法一 手动涂鸦方法二 魔棒工具1. 拖入图片进PS࿰…...
Ubuntu 24.04 LTS Noble安装Docker Desktop简单教程
Docker 为用户提供了在 Ubuntu Linux 上快速创建虚拟容器的能力。但是,那些不想使用命令行管理容器的人可以在 Ubuntu 24.04 LTS 上安装 Docker Desktop GUI,本教程将提供用于设置 Docker 图形用户界面的命令…… Docker Desktop 是一个易于使用的集成容…...
XML 和 SimpleXML 入门教程
XML 和 SimpleXML 入门教程 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它是一种自我描述的语言,允许用户定义自己的标签来表示数据。SimpleXML 是 PHP 中的一个扩展,用于解析和操作 XML 数据。本文将介绍 XML 和 …...
Veo 2胶片质感生成器失效?——深度解析Color Science v2.3内核中被屏蔽的Cinematic Grain Injection层
更多请点击: https://kaifayun.com 第一章:Veo 2胶片质感生成器失效现象全景透视 近期大量用户反馈,Veo 2 胶片质感生成器在调用 generate_film_effect() 接口后返回空纹理、纯灰帧或 HTTP 503 Service Unavailable 错误,且该问题…...
我靠这个测试设计方法,把漏测率降低了80%
当“直觉测试”撞上南墙很长一段时间里,我和许多测试同行一样,测试用例的设计主要依靠两样东西:需求文档和“测试直觉”。这种模式在业务逻辑相对简单、迭代速度平缓时还能勉强应付。一旦面对复杂的企业级应用、高频的敏捷迭代,或…...
写论文的神助攻!好用的AI写作辅助软件,逻辑清晰质量高
作为一名刚完成毕业论文的过来人,我太懂写论文的痛苦了 —— 选题迷茫、文献浩如烟海、框架混乱、逻辑不清、反复修改、查重降重反复折腾... 直到我发现了这套 AI 写作工具组合,简直是论文写作的 "开挂神器",效率直接拉满ÿ…...
智能体所有权与版权:AI Agent Harness Engineering 创造的作品归谁所有?
1. 标题选项 《AI Agent创作版权迷局破解:从Harness工程原理到所有权划分的完整指南》 《智能体作品归谁?AI Agent Harness Engineering场景下的版权规则深度拆解》 《告别权属纠纷:一文搞懂AI Agent生成内容的所有权、版权与收益分配规则》 《Harness工程视角下的AI创作权:…...
股票买卖最佳时机:LeetCode121题解
题目LeetCode121给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取…...
1688运营培训/询盘成本从500元降到63.9!1688运营培训还原1688真实玩法
1688运营培训/询盘成本从500元降到63.9!1688运营培训还原1688真实玩法500块钱一个询盘,你敢信?做1688运营培训这么多年,这个数字我都觉得离谱。前阵子遇到一个老板,一上来就开始吐槽1688,说1688就是个垃圾平…...
从NLP到RAG:AI标书生成系统的技术架构与落地路径深度剖析
引言2026年2月,国家发改委等八部门联合印发《关于加快招标投标领域人工智能推广应用的实施意见》,明确到2026年底招标文件检测、智能辅助评标、围串标识别等重点场景在部分省市实现全覆盖。同一时期,《招标投标法》修订草案经国务院常务会议原…...
从单体到事件驱动的生死跃迁:DeepSeek架构委员会认证的6阶段迁移路线图(含风险热力图与回滚触发阈值表)
更多请点击: https://codechina.net 第一章:从单体到事件驱动的生死跃迁:DeepSeek架构委员会认证的6阶段迁移路线图(含风险热力图与回滚触发阈值表) 向事件驱动架构(EDA)演进不是功能迭代&…...
UE5项目打包后RenderTarget导出图片全黑?手把手教你解决伽马校正与资产打包问题
UE5打包后RenderTarget导出图片全黑的终极解决方案当你花了整整三天时间调试RenderTarget导出功能,终于在编辑器里看到完美的截图效果,却在打包成可执行文件后发现所有导出的图片都变成了一片漆黑——这种从云端跌入谷底的感觉,每个UE开发者都…...
基于CNN的食双星光变曲线自动化参数初估模型EBOP MAVEN
1. 项目概述与核心价值在恒星天体物理领域,食双星系统一直扮演着“宇宙实验室”的关键角色。通过分析两颗恒星相互绕转时周期性相互遮挡产生的光变曲线,我们可以像解谜一样,精确反演出恒星的质量、半径、轨道倾角等基本物理参数。这些参数是构…...
