记一个有意思的写法

api.js

javascript 复制代码
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/query
    checkQuery: '/query',
    // 导航菜单查询单独使用查询待核查数据
    checkQueryVerified: '/check/query',
    // 查询变更记录-产品信息配置
    queryJrxxProductInfoHistory: '/article/operate/jrxx_pi/productinfo/history',
    // 更新产品信息配置
    operateJrxxProductInfo: '/article/operate/jrxx_pi/productinfo',
    // 核查操作 核查页面补上/check前缀  /check/operate
    checkOperate: '/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);

页面使用

javascript 复制代码
<script setup>
import { useApiHooks } from '@/services/api';

const ApiHooks = useApiHooks({ bizUrl, urlPrefix: route?.query?.mode === 'verify' ? '/check' : '' });
const [articleQueryLoading, articleQuery] = ApiHooks.articleQuery();
// 控制页面loading
        const loading = computed(() =>
            [
                articleQueryLoading,
                publishLoading,
                approvalCommitLoading,
                deleteLoading,
                withdrawLoading,
                offshelveLoading,
                fileDownloadLoading,
                unpublishLoading,
            ].some((i) => Boolean(i?.value)),
        );
</script>
相关推荐
林焱_RPAAI15 小时前
影刀RPA技术深度:CSS选择器高级实战指南——伪类属性选择器与性能对比完全解析
vue.js·react.js
陳陈陳16 小时前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js
黄泉路醉s21 小时前
在Vant+Vue+TypeScript的H移动前端使用UnoCSS
前端·vue.js·typescript
我要两颗404西柚1 天前
Stage three:VUE工程化与实战工具
前端·javascript·vue.js
看昭奚恤哭1 天前
基于 RuoYi-Vue-Pro 定制了一个后台管理系统 magic-admin , 开源出来!
前端·vue.js·开源
妙码生花2 天前
从 PHP 到 AI + Golang,程序员自救转型手记(四十五):前端远程下拉输入组件
前端·javascript·vue.js
Listen·Rain2 天前
AGENTS.md — Vue 3 Frontend Development
前端·javascript·vue.js
南风知我意啊2 天前
Vue3图片缩放拖拽组件全攻略
前端·javascript·vue.js
万亿少女的梦1682 天前
基于Spring Boot、Vue.js与MySQL的流浪猫狗救助系统设计与实现
vue.js·spring boot·mysql·javaweb·权限管理
早睡早起身体好1232 天前
Vue 3 路由与懒加载入门:从零完成一个迷你学习中心
javascript·vue.js·学习