企业级网站开发与部署wordpress网站静态化

web/2025/9/29 19:01:42/文章来源:
企业级网站开发与部署,wordpress网站静态化,ps网站轮播图怎么做,手机可以做网站的服务器吗前言 关于axios全局loading的封装博主已经发过一次了#xff0c;这次是在其基础上增加了token的无感刷新。 token无感刷新流程 首次登录的时候会获取到两个token#xff08;AccessToken#xff0c;RefreshToken#xff09;持久化保存起来#xff08;localStorage方案这次是在其基础上增加了token的无感刷新。 token无感刷新流程 首次登录的时候会获取到两个tokenAccessTokenRefreshToken持久化保存起来localStorage方案正常请求业务接口的时候携带AccessToken当接口口返回401权限错误时使用RefreshToken请求接口获取新的AccessToken替换原有旧的AccessToken并保存继续未完成的请求携带AccessTokenRefreshToken也过期了跳转回登录页面重新登录 后端设计 这里采用node简单实现的后台接口服务 后端存有两个字段分别保存长短token并且每一段时间更新他们短token过期返回 returncode:104长token过期返回 returncode: 108请求成功返回returncode: 0请求头中pass用来接收客户端长token请求头中authorization用来接收客户端短token 1、创建一个新文件夹通过vscode打开运行 npm init -y 2、安装koa npm i koa -s 3、安装nodemon npm i nodemon -g 4、使用路由中间件 npm i koa-router -S 5、跨域处理 npm i koa2-cors 6、新建routes/index.js const router require(koa-router)(); let accessToken init_s_token; //短token let refreshToken init_l_token; //长token/* 5s刷新一次短token */ setInterval(() {accessToken s_tk Math.random(); }, 5000);/* 一小时刷新一次长token */ setInterval(() {refreshToken l_tk Math.random(); }, 600000);/* 登录接口获取长短token */ router.get(/login, async (ctx) {ctx.body {returncode: 0,accessToken,refreshToken,}; });/* 获取短token */ router.get(/refresh, async (ctx) {//接收的请求头字段都是小写的let { pass } ctx.headers;if (pass ! refreshToken) {ctx.body {returncode: 108,info: 长token过期重新登录,};} else {ctx.body {returncode: 0,accessToken,};} });/* 获取应用数据1 */ router.get(/getData, async (ctx) {let { authorization } ctx.headers;if (authorization ! accessToken) {ctx.body {returncode: 104,info: token过期,};} else {ctx.body {code: 200,returncode: 0,data: { id: Math.random() },};} });/* 获取应用数据2 */ router.get(/getData2, async (ctx) {let { authorization } ctx.headers;if (authorization ! accessToken) {ctx.body {returncode: 104,info: token过期,};} else {ctx.body {code: 200,returncode: 0,data: { id: Math.random() },};} });module.exports router; 7、创建index.js文件 const Koa require(koa) const app new Koa(); const index require(./routes/index)const cors require(koa2-cors);app.use(cors());app.use(index.routes(),index.allowedMethods())app.listen(4000,() {console.log(server is listening on port 4000) }) 8、配置package.json dev:nodemon index.js, 9、运行 npm run dev这时服务端已准备好 npm run dev前端源码 interceptors.ts /** axios封装* 请求拦截、相应拦截、错误统一处理*/ import Axios from axios; import { ElMessage, ElLoading } from element-plus; import _ from lodash; import router from /router; import BaseRequest from /request/request; const axios Axios.create({//baseURL: localStorage.getItem(address)?.toString(), // url base url request url// timeout: 50000 // request timeout }); // loading对象 let loadingInstance: { close: () void } | null; // 变量isRefreshing let isRefreshing false; // 后续的请求队列 let requestList: ((newToken: any) void)[] []; // 请求合并只出现一次loading // 当前正在请求的数量 let loadingRequestCount 0; // post请求头 axios.defaults.headers.post[Content-Type] application/json;charsetUTF-8; // request interceptoraxios.interceptors.request.use((config: any) {let loadingTarget body;if (config.headers.loadingTarget) {loadingTarget config.headers.loadingTarget;}const isShowLoading config.headers.isShowLoading;const target document.querySelector(loadingTarget);if (target !isShowLoading) {// 请求拦截进来调用显示loading效果showLoading(loadingTarget);}// do something before request is sent// if (sessionStorage.getItem(token)) {// config.headers.Authorization // Bearer sessionStorage.getItem(token); // 让每个请求携带自定义 token 请根据实际情况自行修改// }if (config.url) {// 此处为 Refresh Token 专用接口请求头使用 Refresh Tokenif (config.url.indexOf(/refresh) 0) {config.headers.Authorization localStorage.getItem(RefreshToken);} else if (!(config.url.indexOf(/login) ! -1)) {// 其他接口请求头使用 Access Tokenconfig.headers.Authorization localStorage.getItem(accessToken);}}return config;},(error) {// do something with request errorconsole.log(error); // for debugreturn Promise.reject(error);} ); // http response 拦截器 axios.interceptors.response.use(async (response) {setTimeout(() {hideLoading();}, 200);const data response.data;if (data.code 401) {// 控制是否在刷新token的状态if (!isRefreshing) {// 修改isRefreshing状态isRefreshing true;// 这里是获取新token的接口方法在这里省略了。const url /refresh;const BaseRequestFun new BaseRequest(url, );BaseRequestFun.get().then(async (res) {if (res res.accessToken) {console.log(a);// 新tokenconst newToken res.accessToken;// 保存新的accessTokenlocalStorage.setItem(accessToken, newToken);// 替换新accessTokenresponse.config.headers.Authorization newToken;// token 刷新后将数组里的请求队列方法重新执行requestList.forEach((cb) cb(newToken));// 重新请求完清空requestList [];// 继续未完成的请求const resp await axios.request(response.config);// 重置状态isRefreshing false;// 返回请求结果return resp;} else {// 清除tokenlocalStorage.clear();// 重置状态isRefreshing false;// 跳转到登录页router.replace(/);}});} else {// 后面的请求走这里排队// 返回未执行 resolve 的 Promisereturn new Promise((resolve) {// 用函数形式将 resolve 存入等待获取新token后再执行requestList.push((newToken) {response.config.headers.Authorization newToken;resolve(axios(response.config));});});}}return data;},(err) {setTimeout(() {hideLoading();}, 200);// 返回状态码不为200时候的错误处理ElMessage({message: err.toString(),type: error,duration: 5 * 1000,});return Promise.resolve(err);} ); // 显示loading的函数 并且记录请求次数 const showLoading (target: any) {if (loadingRequestCount 0) {loadingInstance ElLoading.service({lock: true,text: 加载中...,target: target,background: rgba(255,255,255,0.5),});}loadingRequestCount; };// 隐藏loading的函数并且记录请求次数 const hideLoading () {if (loadingRequestCount 0) return;loadingRequestCount--;if (loadingRequestCount 0) {toHideLoading();} };// 防抖将 300ms 间隔内的关闭 loading 便合并为一次. 防止连续请求时, loading闪烁的问题。 const toHideLoading _.debounce(() {// eslint-disable-next-line typescript-eslint/ban-ts-comment// ts-ignoreloadingInstance.close();loadingInstance null; }, 300);export default axios; request.ts import instance from ./interceptors; import { ElMessage } from element-plus;export default class baseRequest {private url: any;private params: any;constructor(url: any, params: any) {this.url url;this.params typeof params undefined ? {} : params;}get(...params: any[]) {return instance.get(this.url, {params: this.params,headers: {loadingTarget: params[0],isShowLoading: params[1] undefined ? true : params[1],},}).then((res: any) {if (res.code 200) {return Promise.resolve(res);} else {ElMessage({message: res.entitys[Object.keys(res.entitys)[0]],type: error,duration: 5 * 1000,});return Promise.resolve(false);}}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}post(...params: any[]) {return instance.post(this.url, this.params, {headers: {loadingTarget: params[0],isShowLoading: params[1] undefined ? true : params[1],},}).then((res: any) {if (res.code 200) {return Promise.resolve(res.entitys);} else {ElMessage({message: res.entitys[Object.keys(res.entitys)[0]],type: error,duration: 5 * 1000,});Promise.resolve(false);}}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}put(...params: any[]) {return instance.put(this.url, this.params, {headers: {loadingTarget: params[0],isShowLoading: params[1] undefined ? true : params[1],},}).then((res: any) {if (res.code 200) {return Promise.resolve(res.entitys);} else {ElMessage({message: res.entitys[Object.keys(res.entitys)[0]],type: error,duration: 5 * 1000,});Promise.resolve(false);}}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}delete(...params: any[]) {return instance.delete(this.url, {params: this.params,headers: {loadingTarget: params[0],isShowLoading: params[1] undefined ? true : params[1],},}).then((res: any) {if (res.code 200) {return Promise.resolve(res.entitys);} else {ElMessage({message: res.entitys[Object.keys(res.entitys)[0]],type: error,duration: 5 * 1000,});Promise.resolve(false);}}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}upfile(...params: any[]) {return instance.post(this.url, this.params, {headers: {Content-Type: multipart/form-data,X-Requested-With: XMLHttpRequest,loadingTarget: params[0],isShowLoading: params[1] undefined ? true : params[1],},}).then((res: any) {if (res.code 200) {return Promise.resolve(res.entitys);} else {ElMessage({message: res.entitys[Object.keys(res.entitys)[0]],type: error,duration: 5 * 1000,});Promise.resolve(false);}}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}downfile(...params: any[]) {return instance.post(this.url, this.params, { responseType: blob }).then((res: any) {const fileReader new FileReader();fileReader.onload function (e: any) {try {const jsonData JSON.parse(e.target.result); // 说明是普通对象数据后台转换失败if (jsonData.code) {ElMessage({message: jsonData.message,type: error,duration: 5 * 1000,});Promise.resolve(false);}} catch (err) {// 解析成对象失败说明是正常的文件流const url window.URL.createObjectURL(res);const eleLink document.createElement(a);eleLink.href url;eleLink.download params[2];// eleLink.download 1.xls;document.body.appendChild(eleLink);eleLink.click();window.URL.revokeObjectURL(url);}};fileReader.readAsText(res);}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}icd9Export() {return instance.post(this.url, this.params, { responseType: blob }).then((res: any) {const fileReader new FileReader();fileReader.onload function (e: any) {try {const jsonData JSON.parse(e.target.result); // 说明是普通对象数据后台转换失败if (jsonData.code) {ElMessage({message: jsonData.message,type: error,duration: 5 * 1000,});Promise.resolve(false);}} catch (err) {// 解析成对象失败说明是正常的文件流const url window.URL.createObjectURL(res);const eleLink document.createElement(a);eleLink.href url;eleLink.download icd9.xls;document.body.appendChild(eleLink);eleLink.click();window.URL.revokeObjectURL(url);}};fileReader.readAsText(res);}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});}icd10Export() {return instance.post(this.url, this.params, { responseType: blob }).then((res: any) {const fileReader new FileReader();fileReader.onload function (e: any) {try {const jsonData JSON.parse(e.target.result); // 说明是普通对象数据后台转换失败if (jsonData.code) {ElMessage({message: jsonData.message,type: error,duration: 5 * 1000,});Promise.resolve(false);}} catch (err) {// 解析成对象失败说明是正常的文件流const url window.URL.createObjectURL(res);const eleLink document.createElement(a);eleLink.href url;eleLink.download icd10.xls;document.body.appendChild(eleLink);eleLink.click();window.URL.revokeObjectURL(url);}};fileReader.readAsText(res);}).catch((e) {ElMessage({message: e,type: error,duration: 5 * 1000,});Promise.resolve(false);});} } 测试vue templatedivel-button typeprimary clicklogin()登录/el-buttonel-button typeprimary clickgetData()接口一/el-buttonel-button typeprimary clickgetData2()接口二/el-button/div /templatescript langts setup import BaseRequest from /request/request; const login () {const url /login;const BaseRequestFun new BaseRequest(url, );BaseRequestFun.get().then((res) {if (res) {console.log();localStorage.setItem(accessToken, res.accessToken);localStorage.setItem(RefreshToken, res.refreshToken);}}); }; const getData () {const url /getData;const BaseRequestFun new BaseRequest(url, );BaseRequestFun.get().then((res) {if (res) {console.log(res);}}); }; const getData2 () {const url /getData2;const BaseRequestFun new BaseRequest(url, );BaseRequestFun.get().then((res) {if (res) {console.log(res);}}); }; /scriptstyle langscss/style

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

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

相关文章

网站代运营公司有哪些哪些官网用wordpress

目录 单例模式(Singleton Pattern) 优缺点 使用场景 饿汉式和懒汉式单例模式 单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是一个类只允许创建一个对象(或者实例&#xff…

免费自创网站做网站能赚钱

IDEA中连接SQLserver数据库(DataGrip相同连接) 1. 打开IDEA-database组件 2. 新建SQL server连接 3. 填写信息进行连接 填写连接名称,连接主机IP,端口,默认端口1433,数据库用户名密码,默认数据库用户名是sa 第一次连接…

在哪里找手机网站建设公司做什么网站赚钱最快

我们在JSTL标签中看到“JSP”这种类型的定义,但是不知道它是什么意思,其实它的意思就是定义了一个JSTL标签内部是否允许使用JSP表达式,先来了解什么是JSTL标签体,请看代码://中间即为JSTL标签体再来看看什么是jsp表达式…

专业的家居行业网站制作泉州哪家网站建设公司好

xhtml css页面制作过程中问题的解决方案,说是解决方案应该有点过了,充其量只不过是给刚刚开始学标准页面制作的朋友们的一些小建议,如 2018-04-14XHTML里面的img标记应该这样写:,这种写法也就是所谓的自关闭&#xff0…

珠海微信网站宝钢建设工程有限公司网站

为了提供一致的编辑体验,您需要一致的数据和可预测的行为。不幸的是,DOM缺乏这两个特性。现代编辑器的解决方案是维护自己的文档模型来表示它们的内容。对于Quill来说,Parchment就是这样的解决方案。它在自己的代码库中组织,并拥有…

工商局官网入口网站优化18600119496

1588: [HNOI2002]营业额统计 Time Limit: 5 SecMemory Limit: 162 MBDescription 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以…

网站推广排名WordPress能做门户网吗

本篇文章主要介绍了关于address标签用法。或许有些朋友对于address标签有点陌生,也会产生address是什么意思的疑问,毕竟在我们日常建站过程中,很少会用到这个标签。但是俗话说,存在即合理。html里每一个标签都有他自己的定义和用处…

宝山网站建设哪家好时尚网站

netcat(nc)下载及基本使用 - 知乎

织梦教育网站模板甜品店网站开发背景

IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件:Api…

丹徒网站建设平台分销商城平台

一、Cookie的出现浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现。针对上述的问题,网景公司的程序员创造了Cookie。…

个人网站可以放广告吗上传图片的网站要怎么做

忍着疼痛奔跑,带着泪光微笑转瞬,毕业已近四年,回顾,还在路上。头几年,有着一颗爱玩的心,秉着“人这一辈子不能对不起自己”的谬论,一直随着自己的性子,想做什么就做什么,…

学校网站设计流程公司门户网站建设公司

Spring 就是⼀个包含了众多工具方法的 IoC 容器。既然是容器那么它就具备两个最基本的功能: 将对象存储到容器(Spring)中从容器中将对象取出来 接下来使用 Maven 方式来创建一个 Spring 项目,创建 Spring 项目和 Servlet 类似&a…

怎么看一个网站是html5百度seo关键词排名s

Day3 链表 链表也是一种很重要的数据结构,链表的优势是空间不必连续,分配比较自由,缺点是不支持随机访问,想要获取链表中间的某个元素,必须要从头遍历。 LeetCode 203.移除链表元素【虚拟头结点】 移除链表中的某个…

建设网站设计的公司网站返回500错误

这里的笔记是关于蓝桥杯关键知识点的记录,有别于基础语法,很多内容只要求会用就行,无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout: 1.3 string以下是字符串的一些简介:字符串…

企业案例网站生成网页跳转微信小程序

Mycat 1.Mycat 分库分表中间件,将存放在一个数据库的数据存放在不同的多个数据库中。来分散负载。 scheme 逻辑库,对应mysql的数据库,一个逻辑库定义了包含的所有table.是数据库集群对外的统一访问接口。table 逻辑表,和物理数…

提供网站建设找哪家公司好wordpress邮件配置

一. 主要内容 1. 数据层和业务层父类。(泛型约束) 2. 模板方法模式(业务层子类方法通过业务层父类调用数据层子类的方法)。 二. 源代码 http://files.cnblogs.com/HuoAA/EF%E4%B8%89%E5%B1%82.rar转载于:https://www.cnblogs.com/…

seo整站优化价格咋做黄页网站

IPTV即交互式网络电视,是一种利用宽带网,集互联网、多媒体、通讯等技术于一体,向用户提供包括数字电视在内的多种交互式服务的崭新技术。它能够很好地适应当今网络飞速发展的趋势,充分有效地利用网络资源。 IPTV既不同于传统的模…

连云港网站建设电话成都网站推广营销

mysql连接不断线MySql配置为删除任何闲置超过8小时的连接。 这意味着什么? 在8个小时的间隔后返回到已部署的应用程序之后(如果未更改默认SQL参数),将会遇到异常情况。 如何解决这个问题? 增加wait_time参数-不是一个…

网站域名备案变更汇点远程app下载安装

202350读书笔记|《再别康桥:徐志摩诗选》——微风起,清芬酝藉,不减荼 《再别康桥:徐志摩诗选》我觉得有时候诗人是很狂热的,上头的感觉。 有几首很喜欢,节选如下: 偶然 我是天空里的一片云&…