业务注入
框架对部分涉及业务逻辑的组件(例如字典选择器、网格选择器等)进行了抽象化的封装,将具体的抽象方法交由使用者实现,所以在使用对应组件之前,需要注入相关方法。
全局注入
通过应用的provide方法可以进行业务方法的全局注入,它将作用于应用的所有子组件及后代组件。
ts
import { createApp } from 'vue';
import axios from 'axios';
import {
CHECK_AUTHORITY_KEY,
FILE_UPLOAD_URL_KEY,
HANDLE_FILE_RESPONSE_KEY,
HANDLE_FILE_URLS_KEY,
LOAD_DICT_LIST_KEY,
LOAD_GRID_BY_CODE_KEY,
} from 'liv-web';
import App from './src/App.vue';
const app = createApp(App);
// 假设当前登录用户拥有以下权限标识
const authoritys = ['docAdmin'];
// 注入权限校验方法
app.provide(CHECK_AUTHORITY_KEY, authority => authoritys.includes(authority));
// 注入加载数据字典方法
app.provide(LOAD_DICT_LIST_KEY, dictType =>
axios
.get('/api/dict/list', {
params: {
dictType: dictType,
},
})
.then(res => res.data),
);
// 注入根据网格编码查询网格方法
app.provide(LOAD_GRID_BY_CODE_KEY, gridCode =>
axios
.get('/api/grid/getByCode', {
params: {
gridCode: gridCode,
},
})
.then(res => res.data),
);
// 注入文件上传地址
app.provide(FILE_UPLOAD_URL_KEY, `${import.meta.env.VITE_FILE_URL}/cf/FileServer/fileOper`);
// 注入处理文件上传请求返回的response方法
app.provide(HANDLE_FILE_RESPONSE_KEY, response => {
return response.message[0];
});
// 注入将数据库存储的文件地址转换为可以访问的文件地址数组方法
app.provide(HANDLE_FILE_URLS_KEY, urls => {
return (
urls
?.split(',')
?.map(
url =>
`${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url}`,
) ?? []
);
});
// 全局注入更多业务方法...更多可注入业务方法请参考可注入业务。
局部注入
在组件中使用provide可以进行局部注入,它将作用于该组件的所有子组件及后代组件。
vue
<template>
<liv-data-form :model="form" :fields="fields"></liv-data-form>
<router-view></router-view>
</template>
<script lang="ts" setup>
import { ref, provide } from 'vue';
import { FILE_UPLOAD_URL_KEY, type DataFormFields } from 'liv-web';
// 将作用于当前组件的所有子组件及后代组件
provide(FILE_UPLOAD_URL_KEY, '/new-api/file/upload');
interface FormData {
// ...
}
const form = ref<FormData>({
// ...
});
const fields: DataFormFields<FormData> = [
// ...
];
</script>可注入业务
权限
注入权限校验业务
ts
// 假设当前登录用户拥有以下权限标识
const authoritys = ['docAdmin'];
app.provide(CHECK_AUTHORITY_KEY, authority => authoritys.includes(authority));数据字典
注入加载数据字典业务
ts
app.provide(LOAD_DICT_LIST_KEY, dictType =>
axios
.get('/api/dict/list', {
params: {
dictType: dictType,
},
})
.then(res => res.data),
);注入加载子级数据字典业务
ts
app.provide(LOAD_DICT_LIST_BY_ID_KEY, parentId =>
axios
.get('/api/dict/listById', {
params: {
id: parentId,
},
})
.then(res => res.data),
);网格区域
注入加载根网格业务
ts
app.provide(LOAD_ROOT_GRID_KEY, () =>
axios
.get('/api/grid/getByCode', {
params: {
gridCode: '36',
},
})
.then(res => res.data),
);注入加载用户所属网格业务
ts
app.provide(LOAD_USER_GRID_KEY, () =>
axios
.get('/api/grid/getByCode', {
params: {
gridCode: '3601',
},
})
.then(res => res.data),
);注入根据网格编码加载网格业务
ts
app.provide(LOAD_GRID_BY_CODE_KEY, gridCode =>
axios
.get('/api/grid/getByCode', {
params: {
gridCode: gridCode,
},
})
.then(res => res.data),
);注入根据网格ID加载网格业务
ts
app.provide(LOAD_GRID_BY_ID_KEY, gridId =>
axios
.get('/api/grid/getById', {
params: {
id: gridId,
},
})
.then(res => res.data),
);注入根据网格编码加载子级网格业务
ts
app.provide(LOAD_GRID_CHILDREN_BY_CODE_KEY, gridCode =>
axios
.get('/api/grid/getChildren', {
params: {
gridCode: gridCode,
},
})
.then(res => res.data),
);注入查询起始网格编码到目标网格编码对应的网格树业务
ts
app.provide(LOAD_GRID_TREE_BY_CODE_KEY, (rootCode, targetCode) =>
axios
.get('/api/grid/getExpandedTree', {
params: {
rootCode: rootCode,
targetCode: targetCode,
},
})
.then(res => [res.data.areaTree]),
);文件
注入文件上传地址
ts
app.provide(FILE_UPLOAD_URL_KEY, '/api/file/upload');注入文件上传header
ts
app.provide(FILE_UPLOAD_HEADER_KEY, {
Authorization: import.meta.env.VITE_AUTHORIZATION,
'Blade-Auth': import.meta.env.VITE_BLADE_AUTH,
});注入文件上传data
ts
app.provide(FILE_UPLOAD_DATA_KEY, {
action: 'upload',
rename: true,
belongOrgId: 'ruralLivingEnv',
folder: `${new Date().getFullYear()}-${new Date().getMonth() + 1}`,
flag: true,
});注入处理文件上传response业务
ts
app.provide(HANDLE_FILE_RESPONSE_KEY, response => {
return response.data.fileUrl;
});注入处理文件地址业务
ts
app.provide(HANDLE_FILE_URLS_KEY, urls => {
return (
urls
?.split(',')
?.map(
url =>
`${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url}`,
) ?? []
);
});注入处理缩略图地址业务
ts
app.provide(HANDLE_THUMB_URLS_KEY, urls => {
return (
urls?.split(',')?.map(url => {
const fileSuffix = url.split('.').pop();
return `${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url.replace(
'.' + fileSuffix,
'_thumb.' + fileSuffix,
)}`;
}) ?? []
);
});视频2.1.1
注入加载视频播放配置业务
ts
app.provide(LOAD_VIDEO_PLAY_OPTIONS_KEY, id => {
// 先加载视频信息
return axios
.get('/api/video/get', {
params: {
id: id,
},
})
.then(res => {
// 组装成播放配置并返回
const options: VideoPlayOptions = {
url: res.data.url,
core: res.data.streamType === 'hls' ? 'xgplayer-hls' : 'xgplayer-flv',
definitions: res.data.urls.map(item => {
return {
definition: item.name,
url: item.url,
};
}),
};
return options;
});
});