mirror of
https://gitee.com/yudaocode/yudao-ui-admin-vben.git
synced 2025-12-30 10:32:25 +00:00
feat: utils
This commit is contained in:
29
apps/web-tdesign/src/utils/index.ts
Normal file
29
apps/web-tdesign/src/utils/index.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
export * from './rangePickerProps';
|
||||
export * from './routerHelper';
|
||||
|
||||
/**
|
||||
* 查找数组对象的某个下标
|
||||
* @param {Array} ary 查找的数组
|
||||
* @param {Function} fn 判断的方法
|
||||
*/
|
||||
type Fn<T = any> = (item: T, index: number, array: Array<T>) => boolean;
|
||||
export const findIndex = <T = Recordable<any>>(
|
||||
ary: Array<T>,
|
||||
fn: Fn<T>,
|
||||
): number => {
|
||||
if (ary.findIndex) {
|
||||
return ary.findIndex((item, index, array) => fn(item, index, array));
|
||||
}
|
||||
let index = -1;
|
||||
ary.some((item: T, i: number, ary: Array<T>) => {
|
||||
const ret: boolean = fn(item, i, ary);
|
||||
if (ret) {
|
||||
index = i;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return index;
|
||||
};
|
||||
68
apps/web-tdesign/src/utils/rangePickerProps.ts
Normal file
68
apps/web-tdesign/src/utils/rangePickerProps.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
import { $t } from '#/locales';
|
||||
|
||||
/** 时间段选择器拓展 */
|
||||
export function getRangePickerDefaultProps() {
|
||||
return {
|
||||
// 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 dayjs,支持自定义格式
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
// 绑定值的格式,对 value、defaultValue、defaultPickerValue 起作用。不指定则绑定值为 dayjs 对象
|
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
||||
// 输入框提示文字
|
||||
placeholder: [
|
||||
$t('utils.rangePicker.beginTime'),
|
||||
$t('utils.rangePicker.endTime'),
|
||||
],
|
||||
// 快捷时间范围
|
||||
presets: [
|
||||
{
|
||||
label: $t('utils.rangePicker.today'),
|
||||
value: [dayjs().startOf('day'), dayjs().endOf('day')],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.last7Days'),
|
||||
value: [
|
||||
dayjs().subtract(7, 'day').startOf('day'),
|
||||
dayjs().endOf('day'),
|
||||
],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.last30Days'),
|
||||
value: [
|
||||
dayjs().subtract(30, 'day').startOf('day'),
|
||||
dayjs().endOf('day'),
|
||||
],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.yesterday'),
|
||||
value: [
|
||||
dayjs().subtract(1, 'day').startOf('day'),
|
||||
dayjs().subtract(1, 'day').endOf('day'),
|
||||
],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.thisWeek'),
|
||||
value: [dayjs().startOf('week'), dayjs().endOf('day')],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.thisMonth'),
|
||||
value: [dayjs().startOf('month'), dayjs().endOf('day')],
|
||||
},
|
||||
{
|
||||
label: $t('utils.rangePicker.lastWeek'),
|
||||
value: [
|
||||
dayjs().subtract(1, 'week').startOf('day'),
|
||||
dayjs().endOf('day'),
|
||||
],
|
||||
},
|
||||
],
|
||||
showTime: {
|
||||
defaultValue: [
|
||||
dayjs('00:00:00', 'HH:mm:ss'),
|
||||
dayjs('23:59:59', 'HH:mm:ss'),
|
||||
],
|
||||
format: 'HH:mm:ss',
|
||||
},
|
||||
};
|
||||
}
|
||||
38
apps/web-tdesign/src/utils/routerHelper.ts
Normal file
38
apps/web-tdesign/src/utils/routerHelper.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import type {
|
||||
RouteLocationNormalized,
|
||||
RouteRecordNormalized,
|
||||
} from 'vue-router';
|
||||
|
||||
import { defineAsyncComponent } from 'vue';
|
||||
|
||||
const modules = import.meta.glob('../views/**/*.{vue,tsx}');
|
||||
|
||||
/**
|
||||
* 注册一个异步组件
|
||||
* @param componentPath 例:/bpm/oa/leave/detail
|
||||
*/
|
||||
export function registerComponent(componentPath: string) {
|
||||
for (const item in modules) {
|
||||
if (item.includes(componentPath)) {
|
||||
// 使用异步组件的方式来动态加载组件
|
||||
return defineAsyncComponent(modules[item] as any);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const getRawRoute = (
|
||||
route: RouteLocationNormalized,
|
||||
): RouteLocationNormalized => {
|
||||
if (!route) return route;
|
||||
const { matched, ...opt } = route;
|
||||
return {
|
||||
...opt,
|
||||
matched: (matched
|
||||
? matched.map((item) => ({
|
||||
meta: item.meta,
|
||||
name: item.name,
|
||||
path: item.path,
|
||||
}))
|
||||
: undefined) as RouteRecordNormalized[],
|
||||
};
|
||||
};
|
||||
63
apps/web-tdesign/src/utils/useUpload.ts
Normal file
63
apps/web-tdesign/src/utils/useUpload.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
enum UploadType {
|
||||
Image = 'image',
|
||||
Video = 'video',
|
||||
Voice = 'voice',
|
||||
}
|
||||
|
||||
const useBeforeUpload = (type: UploadType, maxSizeMB: number) => {
|
||||
const fn = (file: File): boolean => {
|
||||
let allowTypes: string[] = [];
|
||||
let name = '';
|
||||
|
||||
switch (type) {
|
||||
case UploadType.Image: {
|
||||
allowTypes = [
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
'image/gif',
|
||||
'image/bmp',
|
||||
'image/jpg',
|
||||
];
|
||||
maxSizeMB = 2;
|
||||
name = '图片';
|
||||
break;
|
||||
}
|
||||
case UploadType.Video: {
|
||||
allowTypes = ['video/mp4'];
|
||||
maxSizeMB = 10;
|
||||
name = '视频';
|
||||
break;
|
||||
}
|
||||
case UploadType.Voice: {
|
||||
allowTypes = [
|
||||
'audio/mp3',
|
||||
'audio/mpeg',
|
||||
'audio/wma',
|
||||
'audio/wav',
|
||||
'audio/amr',
|
||||
];
|
||||
maxSizeMB = 2;
|
||||
name = '语音';
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 格式不正确
|
||||
if (!allowTypes.includes(file.type)) {
|
||||
message.error(`上传${name}格式不对!`);
|
||||
return false;
|
||||
}
|
||||
// 大小不正确
|
||||
if (file.size / 1024 / 1024 > maxSizeMB) {
|
||||
message.error(`上传${name}大小不能超过${maxSizeMB}M!`);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
return fn;
|
||||
};
|
||||
|
||||
export { UploadType, useBeforeUpload };
|
||||
Reference in New Issue
Block a user