extraFile

This commit is contained in:
wenjiarui 2023-09-13 15:08:50 +08:00
commit 52673b8960
238 changed files with 1317 additions and 658 deletions

View File

@ -2,7 +2,7 @@ import { WebEnv, WechatMpEnv } from 'oak-domain/lib/types/Environment';
import { AppType } from '../oak-app-domain/Application/Schema';
import { EntityDict } from '../oak-app-domain';
import { QiniuUploadInfo } from 'oak-frontend-base';
import { Config, Origin } from '../types/Config';
import { Config } from '../types/Config';
import { BackendRuntimeContext } from '../context/BackendRuntimeContext';
export declare type GeneralAspectDict<ED extends EntityDict, Cxt extends BackendRuntimeContext<ED>> = {
mergeUser: (params: {
@ -42,9 +42,7 @@ export declare type GeneralAspectDict<ED extends EntityDict, Cxt extends Backend
env: WebEnv | WechatMpEnv;
}, context: Cxt) => Promise<string>;
getUploadInfo: (params: {
origin: Origin;
bucket?: string;
key?: string;
extraFile: EntityDict['extraFile']['CreateSingle']['data'];
}, context: Cxt) => Promise<QiniuUploadInfo>;
sendCaptcha: (params: {
mobile: string;

View File

@ -1,11 +1,11 @@
import { EntityDict } from '../oak-app-domain';
import { Origin } from '../types/Config';
import { QiniuUploadInfo } from 'oak-frontend-base';
import { BackendRuntimeContext } from '../context/BackendRuntimeContext';
export declare function getUploadInfo<ED extends EntityDict, Cxt extends BackendRuntimeContext<ED>>(params: {
origin: Origin;
bucket?: string;
key?: string;
extraFile: EntityDict['extraFile']['CreateSingle']['data'];
}, context: Cxt): Promise<QiniuUploadInfo>;
export declare function upload<ED extends EntityDict, Cxt extends BackendRuntimeContext<ED>>(params: {
extraFile: EntityDict['extraFile']['CreateSingle']['data'];
}, context: Cxt): Promise<QiniuUploadInfo>;
export declare function getInfoByUrl(params: {
url: string;

View File

@ -2,7 +2,20 @@ import { getConfig } from '../utils/getContextConfig';
import { assert } from 'oak-domain/lib/utils/assert';
import { WechatSDK } from 'oak-external-sdk';
export async function getUploadInfo(params, context) {
const { origin, key, bucket } = params;
const { origin, extra1, filename, objectId, extension, entity, bucket } = params.extraFile;
// 构造文件上传所需的key
const key = `${entity ? entity + '/' : ''}${objectId}${extension ? '.' + extension : ''}`;
assert(origin && origin !== 'unknown');
const { instance, config, } = await getConfig(context, 'Cos', origin);
assert(origin === 'qiniu');
const { uploadHost, domain, bucket: bucket2 } = config;
return instance.getUploadInfo(uploadHost, domain, bucket || bucket2, key);
}
export async function upload(params, context) {
const { origin, extra1, filename, objectId, extension, entity, bucket } = params.extraFile;
// 构造文件上传所需的key
const key = `${entity ? entity + '/' : ''}${objectId}${extension ? '.' + extension : ''}`;
assert(origin && origin !== 'unknown');
const { instance, config, } = await getConfig(context, 'Cos', origin);
assert(origin === 'qiniu');
const { uploadHost, domain, bucket: bucket2 } = config;

View File

@ -37,5 +37,5 @@ export declare type Poi = {
email?: string;
businessArea?: string;
};
declare const Location: (props: LocationProps) => import("react/jsx-runtime").JSX.Element;
declare const Location: (props: LocationProps) => JSX.Element;
export default Location;

View File

@ -29,5 +29,5 @@ export interface AMapProps extends APILoaderProps {
securityJsCode?: string;
serviceHost?: string;
}
declare const memo: (props: AMapProps) => import("react/jsx-runtime").JSX.Element;
declare const memo: (props: AMapProps) => JSX.Element;
export default memo;

View File

@ -7,4 +7,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'article', f
name: string;
width: string;
editor: any;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'article', f
content?: string;
html?: string;
origin?: string;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'article', f
content?: string;
html?: string;
origin?: string;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -19,4 +19,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'articleMenu
setCurrentArticle: (id: string) => void;
}, {
createOne: () => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element | null;
}>): JSX.Element | null;

View File

@ -1,4 +1,3 @@
import { generateNewId } from 'oak-domain/lib/utils/uuid';
export default OakComponent({
entity: 'article',
projection: {
@ -71,16 +70,18 @@ export default OakComponent({
},
},
methods: {
async addExtraFile(extraFile) {
const result = await this.features.cache.operate('extraFile', {
action: 'create',
data: extraFile,
id: generateNewId(),
});
return result;
},
// async addExtraFile(
// extraFile: EntityDict['extraFile']['CreateSingle']['data']
// ) {
// const result = await this.features.cache.operate('extraFile', {
// action: 'create',
// data: extraFile,
// id: generateNewId(),
// });
// return result;
// },
async uploadFile(extraFile) {
const result = await this.features.extraFile.upload(extraFile);
const result = await this.features.extraFile.createAndUpload(extraFile);
return result;
},
setEditor(editor) {

View File

@ -26,4 +26,4 @@ export default function Render(props: WebComponentProps<EntityDict, "article", f
}>;
clearContentTip: () => void;
gotoPreview: (content?: string, title?: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -67,7 +67,7 @@ export default function Render(props) {
const { url, bucket } = await uploadFile(extraFile);
extraFile.bucket = bucket;
extraFile.extra1 = null;
await addExtraFile(extraFile);
// await addExtraFile(extraFile);
// 最后插入图片
insertFn("http://" + url, extraFile.filename);
}

View File

@ -34,4 +34,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'articleMenu
createSubArticle: (name: string) => Promise<void>;
createSubArticleMenu: (name: string) => Promise<void>;
gotoDoc: (articleMenuId: string) => void;
}>): import("react/jsx-runtime").JSX.Element | null;
}>): JSX.Element | null;

View File

@ -33,4 +33,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'articleMenu
createOne: (name?: string) => Promise<void>;
getDefaultArticle: (rows: EntityDict['articleMenu']['OpSchema'][]) => void;
getSearchArticle: () => Promise<string[]>;
}>): import("react/jsx-runtime").JSX.Element | null;
}>): JSX.Element | null;

View File

@ -14,4 +14,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'articleMenu
searchArticle: (searchValue: string) => void;
getArticleMenuIdByArticle: (articleId: string, type: string) => void;
gotoSearchArticleAndArticleMenu: (articleMenuId: string, articleId: string) => void;
}>): import("react/jsx-runtime").JSX.Element | null;
}>): JSX.Element | null;

View File

@ -10,4 +10,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
setMobile: (value: string) => void;
sendCaptcha: (mobile: string) => Promise<void>;
onConfirmByMobile: (mobile: string, captcha: string, newPassword: string) => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -5,4 +5,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
failTimes: number;
}, {
onConfirm: (prevPassword: string, password: string) => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -6,4 +6,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
oakId: string;
}, {
goToMobile: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -7,7 +7,7 @@ declare type IDownloadProps = {
style?: React.CSSProperties;
filename?: string;
};
declare function Download(props: IDownloadProps): import("react/jsx-runtime").JSX.Element;
declare function Download(props: IDownloadProps): JSX.Element;
declare namespace Download {
var onDownload: (arrayBuffer: ArrayBuffer, filename: string) => void;
var base64ToBlob: (base64String: string) => Blob;

View File

@ -1,3 +1,3 @@
import './index.less';
declare const Empty: () => import("react/jsx-runtime").JSX.Element;
declare const Empty: () => JSX.Element;
export default Empty;

View File

@ -1,3 +1,3 @@
import './index.less';
declare const Empty: () => import("react/jsx-runtime").JSX.Element;
declare const Empty: () => JSX.Element;
export default Empty;

View File

@ -15,5 +15,5 @@ interface IErrorPageProps {
children?: React.ReactNode;
icon?: React.ReactNode;
}
declare function ErrorPage(props: IErrorPageProps): import("react/jsx-runtime").JSX.Element;
declare function ErrorPage(props: IErrorPageProps): JSX.Element;
export default ErrorPage;

View File

@ -15,5 +15,5 @@ declare type GridProps = {
list: Array<Item>;
onChange?: (index: number, event?: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
};
declare const _default: React.MemoExoticComponent<(props: GridProps) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: GridProps) => JSX.Element>;
export default _default;

View File

@ -17,5 +17,5 @@ declare type PageHeaderProps = {
children?: React.ReactNode;
showHeader?: boolean;
};
declare const _default: React.MemoExoticComponent<(props: PageHeaderProps) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: PageHeaderProps) => JSX.Element>;
export default _default;

View File

@ -14,5 +14,5 @@ declare type IQrCodeProps = {
successed?: boolean;
type?: EntityDict['wechatLogin']['Schema']['type'];
};
declare function QrCode(props: IQrCodeProps): import("react/jsx-runtime").JSX.Element;
declare function QrCode(props: IQrCodeProps): JSX.Element;
export default QrCode;

View File

@ -5,5 +5,5 @@ declare type Props = {
description?: string;
children?: React.ReactNode;
};
declare const _default: React.MemoExoticComponent<(props: Props) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: Props) => JSX.Element>;
export default _default;

View File

@ -5,5 +5,5 @@ declare type Props = {
description?: string;
children?: React.ReactNode;
};
declare const _default: React.MemoExoticComponent<(props: Props) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: Props) => JSX.Element>;
export default _default;

View File

@ -14,5 +14,5 @@ interface GrantProps {
rootStyle?: React.CSSProperties;
rootClassName?: string;
}
declare function Grant(props: GrantProps): import("react/jsx-runtime").JSX.Element;
declare function Grant(props: GrantProps): JSX.Element;
export default Grant;

View File

@ -14,5 +14,5 @@ interface QrCodeProps {
rootStyle?: React.CSSProperties;
rootClassName?: string;
}
declare function QrCode(props: QrCodeProps): import("react/jsx-runtime").JSX.Element;
declare function QrCode(props: QrCodeProps): JSX.Element;
export default QrCode;

View File

@ -15,5 +15,5 @@ export default function render(props: WebComponentProps<EntityDict, 'user', fals
setValue: (path: string, value: string) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;
export {};

View File

@ -4,4 +4,4 @@ export default function Web(props: {
setValue: (path: string, value: any) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function WechatMp(props: {
setValue: (path: string, value: any) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -5,4 +5,4 @@ export default function WechatPublic(props: {
setValue: (path: string, value: any) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -3,5 +3,5 @@ declare type StyleProps = {
value?: StyleType | null;
onChange: (value: StyleType) => void;
};
export default function Render(props: StyleProps): import("react/jsx-runtime").JSX.Element;
export default function Render(props: StyleProps): JSX.Element;
export {};

View File

@ -3,4 +3,4 @@ export default function Account(props: {
account: Required<Config>['Account'];
setValue: (path: string, value: any) => void;
removeItem: (path: string, index: number) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -2,4 +2,4 @@ import { Config } from '../../../../types/Config';
export default function Cos(props: {
cos: Required<Config>['Cos'];
setValue: (path: string, value: any) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -2,4 +2,4 @@ import { Config } from '../../../../types/Config';
export default function Cos(props: {
live: Required<Config>['Live'];
setValue: (path: string, value: any) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -2,4 +2,4 @@ import { Config } from '../../../../types/Config';
export default function Cos(props: {
map: Required<Config>['Map'];
setValue: (path: string, value: any) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function Sms(props: {
setValue: (path: string, value: any) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -12,4 +12,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
setValue: (path: string, value: string) => void;
removeItem: (path: string, index: number) => void;
cleanKey: (path: string, key: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -105,10 +105,10 @@ export default OakComponent({
bucket: '',
id: generateNewId(),
};
const { url, bucket } = await this.features.extraFile.upload(extraFile);
const { url, bucket } = await this.features.extraFile.createAndUpload(extraFile);
extraFile.bucket = bucket;
extraFile.extra1 = null;
await this.addExtraFile(extraFile);
// await this.addExtraFile(extraFile);
this.editorCtx.insertImage({
src: 'http://' + url,
});

View File

@ -108,18 +108,24 @@ export default OakComponent({
id: generateNewId(),
entityId,
};
try {
const { bucket } = await this.features.extraFile.upload(updateData);
Object.assign(updateData, {
bucket,
extra1: null,
});
}
catch (error) {
//todo 保存extraFile失败 需要remove七牛图片
throw error;
}
this.addItem(updateData);
// try {
// const { bucket } = await this.features.extraFile.upload(
// updateData
// );
// Object.assign(updateData, {
// bucket,
// extra1: null,
// });
// } catch (error) {
// //todo 保存extraFile失败 需要remove七牛图片
// throw error;
// }
this.addItem(Object.assign({}, updateData, {
extra1: null,
}), undefined, async () => {
console.log(updateData);
await this.features.extraFile.upload(updateData, extra1);
});
if (avatar) {
this.removeItem(avatar.id);
}

View File

@ -6,4 +6,4 @@ export default function render(props: WebComponentProps<EntityDict, 'extraFile',
avatarUrl?: string;
}, {
onPickByWeb: (files: File[]) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -1 +1 @@
export default function render(): import("react/jsx-runtime").JSX.Element;
export default function render(): JSX.Element;

View File

@ -204,18 +204,15 @@ export default OakComponent({
async myAddItem(createData) {
// 目前只支持七牛上传
const { methodsType } = this.state;
this.addItem(createData, async () => {
this.addItem(Object.assign(createData, {
extra1: null,
}), async () => {
if (createData.bucket) {
// 说明本函数已经执行过了
return;
}
if (methodsType === 'uploadLocalImg') {
const { bucket } = await this.features.extraFile.upload(createData);
Object.assign(createData, {
bucket,
extra1: null,
});
}
}, async () => {
await this.features.extraFile.upload(createData, createData.extra1);
});
},
async myUpdateItem(params) {

View File

@ -19,5 +19,5 @@ export default function render(props: WebComponentProps<EntityDict, "extraFile",
closeModal: () => void;
onModal1Confirm: (value: number) => void;
setSelectedId: (id: number) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;
export {};

View File

@ -1,6 +1,6 @@
import { EntityDict } from '../../../oak-app-domain';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/types/Entity';
import { ReactComponentProps } from 'oak-frontend-base';
import { ReactComponentProps } from 'oak-frontend-base/lib/types/Page';
declare type SourceType = 'album' | 'camera';
declare type Theme = 'file' | 'image' | 'image-flow' | 'custom';
declare type FileType = 'all' | 'video' | 'image' | 'file';

View File

@ -1,5 +1,5 @@
import { generateNewId } from 'oak-domain/lib/utils/uuid';
import { assert } from 'oak-domain/lib/utils/assert';
import assert from 'assert';
import Dialog from '../../../utils/dialog/index';
export default OakComponent({
entity: 'extraFile',
@ -251,11 +251,13 @@ export default OakComponent({
callback(updateData, 'uploading');
}
try {
const { bucket } = await this.features.extraFile.upload(updateData);
Object.assign(updateData, {
bucket,
this.addItem(Object.assign({}, updateData, {
extra1: null,
}), undefined, async () => {
console.log(updateData);
await this.features.extraFile.upload(updateData, extra1);
});
await this.execute();
if (callback) {
callback(updateData, 'success');
}
@ -267,20 +269,18 @@ export default OakComponent({
//todo 保存extraFile失败 需要remove七牛图片
throw error;
}
this.addItem(updateData);
await this.execute();
}
else {
this.addItem(updateData, async () => {
this.addItem(Object.assign({}, updateData, {
extra1: null,
}), async () => {
if (updateData.bucket) {
// 说明本函数已经执行过了
return;
}
const { bucket } = await this.features.extraFile.upload(updateData);
Object.assign(updateData, {
bucket,
extra1: null,
});
}, async () => {
await this.features.extraFile.upload(updateData, extra1);
});
}
},

View File

@ -33,5 +33,5 @@ export default function render(props: WebComponentProps<EntityDict, "extraFile",
getUrl: (extraFile: EntityDict['extraFile']['OpSchema']) => string;
getFileName: (extraFile: EntityDict['extraFile']['OpSchema']) => string;
eFFormatBytes: (value: number) => string;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;
export {};

View File

@ -10,4 +10,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
}>;
}, {
onClick: (action: string) => void;
}>): import("react/jsx-runtime").JSX.Element | null;
}>): JSX.Element | null;

View File

@ -10,4 +10,4 @@ export default function render(props: WebComponentProps<EntityDict, 'address', t
resetInitialData: () => void;
downloadEnv: () => void;
resetEnv: (data: Record<string, any>) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
size?: string;
className?: string;
style?: React.CSSProperties;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -11,4 +11,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
router: EntityDict['message']['Schema']['router'];
visitState: EntityDict['message']['Schema']['visitState'];
id: string;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -10,4 +10,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
router: EntityDict['message']['Schema']['router'];
}, {
goPage: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -10,4 +10,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', f
router: EntityDict['message']['Schema']['router'];
}, {
goPage: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', t
messages: EntityDict['message']['Schema'][];
}, {
goDetailById: (id: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'message', t
messages: RowWithActions<EntityDict, 'message'>[];
}, {
goDetailById: (id: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -3,4 +3,4 @@ export default function render(props: {
data: {
data: MessageProps;
};
}): import("react/jsx-runtime").JSX.Element;
}): JSX.Element;

View File

@ -5,4 +5,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'messageType
dirtyIds: string[];
messageTypes: string[];
applicationId: string;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -9,4 +9,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'token', fal
iconName?: string;
iconLarger?: string;
onClick?: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -13,4 +13,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'token', fal
}, {
logout: () => void;
updateAttribute: (attr: string, value: any) => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -13,4 +13,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'token', fal
}, {
logout: () => void;
updateAttribute: (attr: string, value: any) => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
style?: React.CSSProperties;
}, {
goMessageList: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -10,4 +10,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
buttonClassName?: string;
}, {
goMessageList: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -6,4 +6,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'userEntityG
url: string;
expiresAt: number;
title?: string;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function render(props: WebComponentProps<EntityDict, 'parasite',
loading: boolean;
illegal: boolean;
expired: boolean;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -7,4 +7,4 @@ export default function render(props: WebComponentProps<EntityDict, 'parasite',
}, {
cancel: () => void;
getQrCode: () => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -19,4 +19,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'parasite',
onSearch: (value: string) => void;
onSelect: (value: string) => void;
setSearchValue: (value: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -16,4 +16,4 @@ export default function render(props: WebComponentProps<EntityDict, 'area', true
setCheckedList: (station: string, flag: boolean) => void;
cancel: () => void;
confirm: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -3,5 +3,5 @@ interface IProps {
defaultValue?: number | string;
onChange: (color: string) => void;
}
declare const _default: React.MemoExoticComponent<(props: IProps) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: IProps) => JSX.Element>;
export default _default;

View File

@ -9,5 +9,5 @@ interface IProps {
onChange: (value?: any) => void;
options: IOption[];
}
declare const _default: React.MemoExoticComponent<(props: IProps) => import("react/jsx-runtime").JSX.Element>;
declare const _default: React.MemoExoticComponent<(props: IProps) => JSX.Element>;
export default _default;

View File

@ -1 +1 @@
export default function Render(this: any): import("react/jsx-runtime").JSX.Element;
export default function Render(this: any): JSX.Element;

View File

@ -19,4 +19,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'token', fal
sendCaptcha: (mobile: string) => Promise<void>;
loginByMobile: (mobile: string, password?: string, captcha?: string) => Promise<void>;
setLoginMode: (value: number) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -17,4 +17,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', true
goUpsert: () => void;
confirmDelete: (id: string) => Promise<void>;
goUpdate: (id: string) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -11,4 +11,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', true
goUpsert: () => void;
goUpdate: (id: string) => void;
confirmDelete: (id: string) => Promise<void>;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -1 +1 @@
export default function render(this: any): import("react/jsx-runtime").JSX.Element;
export default function render(this: any): JSX.Element;

View File

@ -11,4 +11,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'mobile', fa
onMobileChange: (value: string) => Promise<void>;
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -13,4 +13,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'mobile', fa
onMobileChange: (value: string) => Promise<void>;
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
}, {
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
}, {
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -14,5 +14,5 @@ export default function render(props: WebComponentProps<EntityDict, 'userEntityG
setInit: () => void;
setPeriod: (p: number) => void;
setUnit: (u: Unit) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;
export {};

View File

@ -18,5 +18,5 @@ export default function render(props: WebComponentProps<EntityDict, 'userEntityG
setInit: () => void;
setPeriod: (p: number) => void;
setUnit: (u: Unit) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;
export {};

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
}[];
}, {
onRelationChange: (relation: EntityDict['relation']['OpSchema'], checked: boolean) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -8,4 +8,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
}[];
}, {
onRelationChange: (relation: EntityDict['relation']['OpSchema'], checked: boolean) => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -15,4 +15,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
onMobileChange: (value: string) => Promise<void>;
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -16,4 +16,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'user', fals
onMobileChange: (value: string) => Promise<void>;
onConfirm: () => Promise<void>;
onReset: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

View File

@ -11,4 +11,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'relation',
entityId: string;
relations: EntityDict['relation']['OpSchema'][];
qrCodeType?: QrCodeType;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -6,4 +6,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'wechatLogin
loading: boolean;
successed: boolean;
type: EntityDict['wechatLogin']['Schema']['type'];
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -2,4 +2,4 @@ import { EntityDict } from '../../../oak-app-domain';
import { WebComponentProps } from 'oak-frontend-base';
export default function Render(props: WebComponentProps<EntityDict, 'wechatUser', true, {
wechatUsers: EntityDict['wechatUser']['Schema'][];
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -4,4 +4,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'wechatUser'
wechatLoginId: string;
qrCodeUrl: string;
loading: boolean;
}, {}>): import("react/jsx-runtime").JSX.Element;
}, {}>): JSX.Element;

View File

@ -17,4 +17,6 @@ export interface Schema extends EntityShape {
sort?: Float<22, 10>;
fileType?: String<128>;
isBridge?: Boolean;
uploadState: 'success' | 'failed' | 'uploading';
uploadMeta?: Object;
}

View File

@ -20,6 +20,8 @@ const entityDesc = {
sort: '排序',
fileType: '文件类型',
isBridge: '是否桥接访问',
uploadState: '上传状态',
uploadMeta: '上传需要的metadata',
},
v: {
origin: {
@ -32,6 +34,11 @@ const entityDesc = {
audio: '音频',
file: '文件',
},
uploadState: {
success: '上传成功',
failed: '上传失败',
uploading: '上传中',
},
},
},
}

View File

@ -12,11 +12,11 @@ export declare class ExtraFile<ED extends EntityDict, Cxt extends BackendRuntime
private application;
private locales;
constructor(cache: Cache<ED, Cxt, FrontCxt, AD & CommonAspectDict<ED, Cxt>>, application: Application<ED, Cxt, FrontCxt, AD>, locales: Locales<ED, Cxt, FrontCxt, AD>);
private getUploadInfo;
upload(extraFile: EntityDict['extraFile']['CreateSingle']['data']): Promise<{
createAndUpload(extraFile: EntityDict['extraFile']['CreateSingle']['data']): Promise<{
url: string;
bucket: string;
bucket: ED["extraFile"]["Schema"]["bucket"] | undefined;
}>;
upload(extraFile: EntityDict['extraFile']['CreateSingle']['data'], file: string | File): Promise<Partial<ED["extraFile"]["Schema"]>>;
getUrl(extraFile?: EntityDict['extraFile']['OpSchema'] | EntityDict['extraFile']['Schema'] | null, style?: string): string;
/**
* 使使url时URL.revokeObjectURL释放缓存

View File

@ -2,6 +2,8 @@ import { Feature } from 'oak-frontend-base';
import { Upload } from 'oak-frontend-base/es/utils/upload';
import { composeFileUrl, bytesToSize } from '../utils/extraFile';
import { assert } from 'oak-domain/lib/utils/assert';
import UploaderDict from '../utils/uploader';
import { generateNewId } from 'oak-domain/lib/utils/uuid';
export class ExtraFile extends Feature {
cache;
application;
@ -12,29 +14,89 @@ export class ExtraFile extends Feature {
this.application = application;
this.locales = locales;
}
async getUploadInfo(origin, key) {
const uploadInfo = await this.cache.exec('getUploadInfo', {
origin,
key,
// async getUploadInfo(extraFile: EntityDict['extraFile']['CreateSingle']['data']) {
// // const { origin, extra1, filename, objectId, extension, entity } =
// // extraFile;
// // 构造文件上传所需的key
// // const key = `${entity ? entity + '/' : ''}${objectId}${extension ? '.' + extension : ''}`;
// assert(origin && origin !== 'unknown');
// const uploadInfo = await this.cache.exec('getUploadInfo', {
// extraFile
// });
// return uploadInfo;
// }
async createAndUpload(extraFile) {
await this.cache.operate('extraFile', {
action: 'create',
data: Object.assign({}, extraFile, { extra1: null }),
id: generateNewId(),
});
return uploadInfo;
const result = await this.upload(Object.assign({}, extraFile, { extra1: null }), extraFile.extra1);
const application = this.application.getApplication();
const config = application?.system?.config ||
application?.system?.platform?.config;
const { bucket } = result;
return {
url: composeFileUrl(Object.assign({}, extraFile, { extra1: null }), config),
bucket,
};
}
async upload(extraFile) {
const { origin, extra1, filename, objectId, extension, entity } = extraFile;
// 构造文件上传所需的key
const key = `${entity ? entity + '/' : ''}${objectId}${extension ? '.' + extension : ''}`;
assert(origin && origin !== 'unknown');
const { result: uploadInfo } = await this.getUploadInfo(origin, key);
if (process.env.OAK_PLATFORM === 'wechatMp') {
// 微信小程序使用wx.uploadFile, 封装upload上传源为origin
const up = new Upload();
const result = await up.uploadFile(origin, extra1, uploadInfo);
return result;
async upload(extraFile, file) {
const { id, origin } = extraFile;
assert(origin, '未设置上传方式');
const [extraFileData] = this.cache.get('extraFile', {
data: {
origin: 1,
type: 1,
bucket: 1,
objectId: 1,
tag1: 1,
tag2: 1,
filename: 1,
md5: 1,
entity: 1,
entityId: 1,
extra1: 1,
extension: 1,
size: 1,
sort: 1,
fileType: 1,
isBridge: 1,
uploadState: 1,
uploadMeta: 1,
},
filter: {
id,
},
});
console.log(id, extraFileData);
const up = new Upload();
try {
const uploadInfo = UploaderDict[origin].upload(extraFileData, up.uploadFile, file);
await this.cache.operate('extraFile', {
action: 'update',
data: {
uploadState: 'success',
},
filter: {
id,
},
id: generateNewId(),
});
return extraFileData;
}
else {
const up = new Upload();
const result = await up.uploadFile(origin, extra1, uploadInfo);
return result;
catch (err) {
await this.cache.operate('extraFile', {
action: 'update',
data: {
uploadState: 'failed',
},
filter: {
id,
},
id: generateNewId(),
});
throw err;
}
}
getUrl(extraFile, style) {

1
es/index.d.ts vendored
View File

@ -13,3 +13,4 @@ export { BackendRuntimeContext } from './context/BackendRuntimeContext';
export { FrontendRuntimeContext, SerializedData, } from './context/FrontendRuntimeContext';
export { RuntimeContext } from './context/RuntimeContext';
export { registerWechatPublicTags } from './config/constants';
export { registerUploader } from './utils/uploader';

View File

@ -11,3 +11,4 @@ export { getLivestream, getPlayBackUrl, getStreamObj } from './utils/livestream'
export { BackendRuntimeContext } from './context/BackendRuntimeContext';
export { FrontendRuntimeContext, } from './context/FrontendRuntimeContext';
export { registerWechatPublicTags } from './config/constants';
export { registerUploader } from './utils/uploader';

View File

@ -25,6 +25,8 @@ export declare type OpSchema = EntityShape & {
sort?: Float<22, 10> | null;
fileType?: String<128> | null;
isBridge?: Boolean | null;
uploadState: 'success' | 'failed' | 'uploading';
uploadMeta?: Object | null;
};
export declare type OpAttr = keyof OpSchema;
export declare type Schema = EntityShape & {
@ -44,6 +46,8 @@ export declare type Schema = EntityShape & {
sort?: Float<22, 10> | null;
fileType?: String<128> | null;
isBridge?: Boolean | null;
uploadState: 'success' | 'failed' | 'uploading';
uploadMeta?: Object | null;
article?: Article.Schema;
articleMenu?: ArticleMenu.Schema;
user?: User.Schema;
@ -71,6 +75,8 @@ declare type AttrFilter = {
sort: Q_NumberValue;
fileType: Q_StringValue;
isBridge: Q_BooleanValue;
uploadState: Q_EnumValue<'success' | 'failed' | 'uploading'>;
uploadMeta: Object;
article: Article.Filter;
articleMenu: ArticleMenu.Filter;
user: User.Filter;
@ -99,6 +105,8 @@ export declare type Projection = {
sort?: number;
fileType?: number;
isBridge?: number;
uploadState?: number;
uploadMeta?: number | Object;
article?: Article.Projection;
articleMenu?: ArticleMenu.Projection;
user?: User.Projection;
@ -155,6 +163,8 @@ export declare type SortAttr = {
fileType: number;
} | {
isBridge: number;
} | {
uploadState: number;
} | {
article: Article.SortAttr;
} | {

View File

@ -93,6 +93,14 @@ export const desc = {
},
isBridge: {
type: "boolean"
},
uploadState: {
notNull: true,
type: "enum",
enumeration: ["success", "failed", "uploading"]
},
uploadMeta: {
type: "object"
}
},
actionType: "crud",

View File

@ -1 +1 @@
{ "name": "文件", "attr": { "origin": "源", "type": "类型", "bucket": "桶", "objectId": "对象编号", "tag1": "标签一", "tag2": "标签二", "filename": "文件名", "md5": "md5", "entity": "关联对象", "entityId": "关联对象id", "extra1": "额外信息", "extension": "后缀名", "size": "文件大小", "sort": "排序", "fileType": "文件类型", "isBridge": "是否桥接访问" }, "v": { "origin": { "qiniu": "七牛云", "unknown": "未知" }, "type": { "image": "图像", "video": "视频", "audio": "音频", "file": "文件" } } }
{ "name": "文件", "attr": { "origin": "源", "type": "类型", "bucket": "桶", "objectId": "对象编号", "tag1": "标签一", "tag2": "标签二", "filename": "文件名", "md5": "md5", "entity": "关联对象", "entityId": "关联对象id", "extra1": "额外信息", "extension": "后缀名", "size": "文件大小", "sort": "排序", "fileType": "文件类型", "isBridge": "是否桥接访问", "uploadState": "上传状态", "uploadMeta": "上传需要的metadata" }, "v": { "origin": { "qiniu": "七牛云", "unknown": "未知" }, "type": { "image": "图像", "video": "视频", "audio": "音频", "file": "文件" }, "uploadState": { "success": "上传成功", "failed": "上传失败", "uploading": "上传中" } } }

View File

@ -5,4 +5,4 @@ export default function Render(props: WebComponentProps<EntityDict, 'address', t
}, {
gotoUpsert: (id: string) => void;
goNewAddress: () => void;
}>): import("react/jsx-runtime").JSX.Element;
}>): JSX.Element;

Some files were not shown because too many files have changed in this diff Show More