记一个有意思的写法

api.js

import { request } from '@fesjs/fes';
import { ref, isRef } from 'vue';
import { FMessage } from '@fesjs/fes-design';const postApiWithBizUrl = {// 查询产品productQuery: '/product/query',// 添加/修改产品productOperate: '/product/operate',// 查询审批链approvalQuery: '/approval/query',// 查询文章articleQuery: '/article/query',// 删除文章articleDelete: '/article/delete',// 撤回文章withdraw: '/article/withdraw',// 添加/修改文章articleOperate: '/article/operate',// 查询权限umQuery: '/um/query',// 发布publish: '/publish',// 提交审批approvalCommit: '/approval/commit',// 下架offshelve: '/offshelve',// 添加标签tagInsert: '/tag/insert',// 取消发布unpublish: '/unpublish',// 查询单组标签tagQuery: '/tag/query',// 配置临期提醒articleConfigremind: '/article/configremind',// 删除临期提醒articleDeleteremind: '/article/deleteremind',
};const getApiMap = {// 下载文件fileDownload: '/file/download',// 下载产品信息管理模板jrxxProductInfoTmplDownload: '/article/query/jrxx_pi/productinfo/download',
};const postApiMap = {// 查询产品信息queryJrxxProductInfo: '/article/query/jrxx_pi/productinfo',// 查询复核记录 核查页面补上/check前缀  /check/querycheckQuery: '/query',// 导航菜单查询单独使用查询待核查数据checkQueryVerified: '/check/query',// 查询变更记录-产品信息配置queryJrxxProductInfoHistory: '/article/operate/jrxx_pi/productinfo/history',// 更新产品信息配置operateJrxxProductInfo: '/article/operate/jrxx_pi/productinfo',// 核查操作 核查页面补上/check前缀  /check/operatecheckOperate: '/operate',
};const BASE_URL = process.env.FES_APP_BASE_URL;
console.log('process.env', process.env);
console.log('BASE_URL', BASE_URL);
let getUrlPrefix = () => '';
const middleWare = (apiMap, method = 'post', withBizUrl) => {const API = {};Object.entries(apiMap).forEach(([fnName, url]) => {API[fnName] = (params, { bizUrl, urlPrefix, ...options } = {}) => {urlPrefix = urlPrefix || getUrlPrefix() || '';const fullUrl = urlPrefix + url;return request(withBizUrl && bizUrl ? `${fullUrl}/${isRef(bizUrl) ? bizUrl.value : bizUrl}` : fullUrl, params, {mergeRequest: true,method,...options,}).catch((err) => {if (err?.data?.msg) FMessage.error(err?.data?.msg);return Promise.reject(err);});};});return API;
};
export const setUrlPrefix = (prefix) => {getUrlPrefix = () => prefix;
};export const API = { ...middleWare(postApiMap), ...middleWare(postApiWithBizUrl, 'post', true), ...middleWare(getApiMap, 'get') };const hooksMiddlerWare = (apiObj, settings) => {let outBizUrl;let urlPrefix = '';if (typeof settings === 'string') {outBizUrl = settings;} else {outBizUrl = settings?.bizUrl;urlPrefix = settings?.urlPrefix ?? urlPrefix;}const hooks = {};Object.entries(apiObj).forEach(([hookName, apiFn]) => {hooks[hookName] = (bizUrl = outBizUrl) => {const loading = ref(false);const requestFn = (params, options) => {loading.value = true;return apiFn(params, { bizUrl, ...options, urlPrefix }).then((res) => {loading.value = false;return Promise.resolve(res);}).catch((err) => {loading.value = false;return Promise.reject(err);});};return [loading, requestFn];};});return hooks;
};export const ApiHooks = hooksMiddlerWare(API);
export const useApiHooks = (bizUrl) => hooksMiddlerWare(API, bizUrl);

页面使用

<script setup>
import { useApiHooks } from '@/services/api';const ApiHooks = useApiHooks({ bizUrl, urlPrefix: route?.query?.mode === 'verify' ? '/check' : '' });
const [articleQueryLoading, articleQuery] = ApiHooks.articleQuery();
// 控制页面loadingconst loading = computed(() =>[articleQueryLoading,publishLoading,approvalCommitLoading,deleteLoading,withdrawLoading,offshelveLoading,fileDownloadLoading,unpublishLoading,].some((i) => Boolean(i?.value)),);
</script>

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

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

相关文章

Kafka3.0.0版本——Broker(总体工作流程)

目录 一、Kafka中Broker总体工作流程图解二、Kafka中Broker总体工作流程步骤解析 一、Kafka中Broker总体工作流程图解 总体工作流程图解 二、Kafka中Broker总体工作流程步骤解析 1、broker启动后在zk中注册&#xff0c;如下图所示&#xff1a; 2、controller谁先注册&…

【leetcode经典简单题】自食用||删除链表中倒数第k个结点

step by step. 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…

怎样在Apipost中设计出实用又好看的API文档

Apipost一直推荐文档先行的API设计理念&#xff0c;在Apipost中可以添加Markdown格式的文本&#xff0c;用以储备文档和API文档设计。 作为一种轻量级标记语言&#xff0c;Markdown在撰写文档、博客文章、README文件以及网站内容上被广泛使用。 如何在Apipost中设计出漂亮的文…

分享低成本非隔离PWM控制AC-DC开关芯片 YB5011

简介&#xff1a; YB5011系列是一款高性能低成本PWM控制功率开关&#xff0c;适用于离线式小功率降 压型应用场合&#xff0c;外围电路简单、器件个数少。同时产品内置高耐压MOSFET可提高 系统浪涌耐受能力,集成有完备的带自恢复功能的保护功能&#xff1a;VDD欠压保护、逐周期…

Flutter InheritedWidget 共享状态管理

InheritedWidget和React中的context功能类似&#xff0c;可以实现跨组件数据的传递。 定义一个共享数据的InheritedWidget&#xff0c;需要继承自InheritedWidget 这里定义了一个of方法&#xff0c;该方法通过context开始去查找祖先的HYDataWidget&#xff08;可以查看源码查找…

安防视频监控平台EasyCVR修改参数提示database or disk is full的原因排查

EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。视频监控综合管理平台EasyCVR具备视频汇聚融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大…

SPDK的块设备抽象层,从一个简单的示例程序讲起

最早的SPDK仅仅是一个NVMe驱动,但现在的SPDK已经不是原来的SPDK了,其功能涵盖了整个存储栈。为了能够实现丰富的功能,SPDK实现了一个块设备抽象层,其功能与Linux内核的块设备层类似,这个块设备抽象层称为BDEV。 块设备抽象层BDEV在整个SPDK栈中的位置如图所示,它位于中间…

Win10 拖动文件从文件夹里复制到桌面时出现黑屏资源管理器重启复制失败

环境&#xff1a; Win10 专业版 联想E14笔记本 问题描述&#xff1a; 在文件移动复制时&#xff0c;从文件夹拖拽复制到桌面时&#xff0c;会卡顿&#xff0c;电脑黑屏闪一下&#xff0c;资源管理器重启&#xff0c;复制失败 解决方案&#xff1a; 1.sfc /scannow&#x…

2023年第四届“华数杯”数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&#xff0…

SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤–【思维导图知识范围】 文章目录 SpringBoot系列文章目录本系列校训 SpringBoot技术很多很多环境及工具&#xff1a;必要的知识深层一些的知识 上效果图在Spring Boot里使用ErrorPage还要注意的是 配套资源作业&#xff…

逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】

Midjourney案例分享 图片预览 迪士尼风格&#xff5c;可爱头像 高清原图及关键词Prompt已经放在文末网盘&#xff0c;需要的自取 在数字艺术的新时代&#xff0c;人工智能绘画已经迅速崭露头角。作为最先进的技术之一&#xff0c;AI绘画结合了艺术和科学&#xff0c;开启了一…

Vue3 element-plus表单嵌套表格实现动态表单验证

Vue3结合element-plus表单项可以动态添加/删除 部分效果图如下&#xff1a; 另表格有添加和删除按钮&#xff0c;点击提交进行表单验证。 首先data格式必须是对象包裹数组 import { ref, reactive } from vue; import { FormInstance } from element-plus const froms re…

【Vue3项目实战】vue3项目配置页面切换过渡动画

文章目录 一、先看效果二、全量代码三、注意事项虽然Vue3支持 template 下存在多个根节点&#xff0c;但是 transition 过渡动画并不支持&#xff0c;要实现过渡动画的页面&#xff0c;都需要有一个根标签包裹页面内容&#xff0c;否则就会报如下警告: 四、相关文章友链本专栏记…

Docker run 启动容器报错

今天在Windows下启动docker容器发现的三个错误&#xff1a; Ports are not available: exposing port TCP 0.0.0.0:1521 -> 0.0.0.0:0: listen tcp 0.0.0.0:1521: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 端口…

前端文件上传 、下载

一、文件上传 import { importData } from /api.js;async importFn() {// 文件数据let file null; // 文件使用form-data格式&#xff0c;参数使用json格式let formData new FormData();formData.append("excel", file);formData.append("excelQuery", …

阿里云ECS部署Mysql数据库

说明 首先需要到阿里云官方购买阿里云产品 &#xff0c;如果有机会可以免费试用那会更好&#xff0c;跳过购买云服务步骤下面直接演示。 一、阿里云官网示意图 1.百度搜索 阿里云官方 2.点击控制台 3.展开更多 4. 选择云服务器ECS 5. 点击实例 可以看到服务器状态&#xff…

EXCEL,vlookup以及数据去重

1&#xff0c;新建一个work表格&#xff0c;将数据copy进来&#xff0c;并做简单处理&#xff0c;让看起来舒服 2&#xff0c;使用vlookup函数查找数据是否在库中 注意:上图中的Table_array A1:C152&#xff0c;这个值要加绝对引用&#xff0c;写成&#xff1a; $A$1:$C$15…

每个开发人员都应了解的 SOLID 原则

每个开发人员都应了解的 SOLID 原则 面向对象的编程类型为软件开发带来了全新的设计。 这使开发人员能够将具有相同目的/功能的数据合并到一个类中&#xff0c;以处理该类的唯一目的&#xff0c;而无需考虑整个应用程序。 但是&#xff0c;这种面向对象编程并不能防止程序混乱或…

如何避免GCC优化选项对程序带来的干扰?

引言 先从一小段代码说起&#xff1a; #include <stdio.h>int main() {int sum 0;for (int i 0; i < 100; i) {sum i;}printf("sum %d\n", sum);return 0; }将代码以-O2选项编译后&#xff0c;查看目标程序中的汇率指令&#xff1a; gcc test.c -O2 o…