记一个有意思的写法

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>
相关推荐
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
小远yyds1 小时前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
程序媛小果2 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
小光学长2 小时前
基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库·vue.js·宠物
guai_guai_guai2 小时前
uniapp
前端·javascript·vue.js·uni-app
王哲晓4 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
理想不理想v4 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云4 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
GIS程序媛—椰子5 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js