build
This commit is contained in:
parent
f1445d6864
commit
826f867d0b
|
|
@ -0,0 +1,6 @@
|
|||
import { GeneralRuntimeContext } from '../RuntimeContext';
|
||||
import { EntityDict } from 'oak-app-domain';
|
||||
export declare function getUploadInfo<ED extends EntityDict, Cxt extends GeneralRuntimeContext<ED>>(params: {
|
||||
origin: string;
|
||||
fileName: string;
|
||||
}, context: Cxt): Promise<object>;
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getUploadInfo = void 0;
|
||||
const qiniu_1 = __importDefault(require("../utils/externalUpload/qiniu"));
|
||||
const ExternalUploadClazz = {
|
||||
qiniu: qiniu_1.default,
|
||||
};
|
||||
async function getUploadInfo(params, context) {
|
||||
const { rowStore } = context;
|
||||
const application = await context.getApplication();
|
||||
const { type, config, systemId } = application;
|
||||
const { origin, fileName } = params;
|
||||
const { result: [system] } = await rowStore.select('system', {
|
||||
data: {
|
||||
id: 1,
|
||||
config: 1
|
||||
},
|
||||
filter: {
|
||||
id: systemId
|
||||
}
|
||||
}, context);
|
||||
try {
|
||||
const { config: systemConfig } = system;
|
||||
const originConfig = systemConfig?.Cos[origin];
|
||||
const instance = new ExternalUploadClazz[origin](originConfig);
|
||||
const uploadInfo = await instance.getUploadInfo(fileName);
|
||||
return uploadInfo;
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
exports.getUploadInfo = getUploadInfo;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import { EntityDict } from 'oak-app-domain';
|
||||
import { Feature } from 'oak-frontend-base';
|
||||
import { Aspect, Context } from 'oak-domain/lib/types';
|
||||
export declare class ExtraFile<ED extends EntityDict, Cxt extends Context<ED>, AD extends Record<string, Aspect<ED, Cxt>>> extends Feature<ED, Cxt, AD> {
|
||||
private rwLock;
|
||||
constructor();
|
||||
upload(extraFile: EntityDict['extraFile']['Schema'], scene: string): Promise<{
|
||||
url: string;
|
||||
bucket: string;
|
||||
} | undefined>;
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ExtraFile = void 0;
|
||||
const oak_frontend_base_1 = require("oak-frontend-base");
|
||||
const concurrent_1 = require("oak-domain/lib/utils/concurrent");
|
||||
const uplpad_1 = require("oak-frontend-base/lib/features/uplpad");
|
||||
class ExtraFile extends oak_frontend_base_1.Feature {
|
||||
rwLock;
|
||||
constructor() {
|
||||
super();
|
||||
this.rwLock = new concurrent_1.RWLock();
|
||||
}
|
||||
async upload(extraFile, scene) {
|
||||
await this.rwLock.acquire('X');
|
||||
try {
|
||||
const { origin, extra1: filePath, filename: fileName } = extraFile;
|
||||
const uploadInfo = await this.getAspectProxy().getUploadInfo({
|
||||
origin,
|
||||
fileName,
|
||||
}, scene);
|
||||
if (process.env.OAK_PLATFORM === 'wechatMp') {
|
||||
// 微信小程序使用wx.uploadFile, 封装upload,上传源为origin
|
||||
const up = new uplpad_1.Upload();
|
||||
const result = await up.uploadFile(origin, filePath, uploadInfo);
|
||||
this.rwLock.release();
|
||||
return result;
|
||||
}
|
||||
this.rwLock.release();
|
||||
}
|
||||
catch (err) {
|
||||
this.rwLock.release();
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
__decorate([
|
||||
oak_frontend_base_1.Action
|
||||
], ExtraFile.prototype, "upload", null);
|
||||
exports.ExtraFile = ExtraFile;
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
export default class aliyunInstance {
|
||||
accessKey: string;
|
||||
secretKey: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
constructor(config: {
|
||||
accessKey: string;
|
||||
secretKey: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
});
|
||||
getUploadInfo(fileName: string): Promise<{
|
||||
key: string;
|
||||
signature: string;
|
||||
policy: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
accessKey: string;
|
||||
}>;
|
||||
getPolicyBase64(timeout?: number): string;
|
||||
getSignature(policyBase64: string): string;
|
||||
hmacSha1(encodedFlags: any, secretKey: string): string;
|
||||
urlSafeBase64Encode(jsonFlags: string): string;
|
||||
base64ToUrlSafe(v: string): string;
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const crypto_1 = __importDefault(require("crypto"));
|
||||
const buffer_1 = require("buffer");
|
||||
class aliyunInstance {
|
||||
accessKey;
|
||||
secretKey;
|
||||
uploadHost; //阿里云上传url
|
||||
bucket;
|
||||
domain;
|
||||
constructor(config) {
|
||||
const { accessKey, secretKey, uploadHost, bucket, domain } = config;
|
||||
this.accessKey = accessKey;
|
||||
this.secretKey = secretKey;
|
||||
this.uploadHost = uploadHost;
|
||||
this.bucket = bucket;
|
||||
this.domain = domain;
|
||||
}
|
||||
async getUploadInfo(fileName) {
|
||||
try {
|
||||
const { uploadHost, domain, bucket, accessKey } = this;
|
||||
const key = `${Date.now()}/${fileName}`;
|
||||
const policy = this.getPolicyBase64();
|
||||
const signature = this.getSignature(policy);
|
||||
return {
|
||||
key,
|
||||
signature,
|
||||
policy,
|
||||
uploadHost,
|
||||
bucket,
|
||||
domain,
|
||||
accessKey,
|
||||
};
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
getPolicyBase64(timeout = 8000) {
|
||||
const date = new Date();
|
||||
date.setHours(date.getHours() + timeout);
|
||||
const policyText = {
|
||||
expiration: date.toISOString(),
|
||||
conditions: [
|
||||
['content-length-range', 0, 5 * 1024 * 1024], // 设置上传文件的大小限制,5mb
|
||||
],
|
||||
};
|
||||
const policyBase64 = this.urlSafeBase64Encode(JSON.stringify(policyText));
|
||||
return policyBase64;
|
||||
}
|
||||
getSignature(policyBase64) {
|
||||
const encoded = this.hmacSha1(policyBase64, this.secretKey);
|
||||
;
|
||||
const signature = this.base64ToUrlSafe(encoded);
|
||||
return signature;
|
||||
}
|
||||
hmacSha1(encodedFlags, secretKey) {
|
||||
const hmac = crypto_1.default.createHmac('sha1', secretKey);
|
||||
hmac.update(encodedFlags);
|
||||
return hmac.digest('base64');
|
||||
}
|
||||
urlSafeBase64Encode(jsonFlags) {
|
||||
const encoded = buffer_1.Buffer.from(jsonFlags).toString('base64');
|
||||
return this.base64ToUrlSafe(encoded);
|
||||
}
|
||||
base64ToUrlSafe(v) {
|
||||
return v.replace(/\//g, '_').replace(/\+/g, '-');
|
||||
}
|
||||
}
|
||||
exports.default = aliyunInstance;
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
export default class qiniuInstance {
|
||||
accessKey: string;
|
||||
secretKey: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
constructor(config: {
|
||||
accessKey: string;
|
||||
secretKey: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
});
|
||||
getUploadInfo(fileName: string): Promise<{
|
||||
key: string;
|
||||
uploadToken: string;
|
||||
uploadHost: string;
|
||||
bucket: string;
|
||||
domain: string;
|
||||
}>;
|
||||
getToken(scope: string): string;
|
||||
base64ToUrlSafe(v: string): string;
|
||||
hmacSha1(encodedFlags: any, secretKey: string): string;
|
||||
urlSafeBase64Encode(jsonFlags: string): string;
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const crypto_1 = __importDefault(require("crypto"));
|
||||
const buffer_1 = require("buffer");
|
||||
class qiniuInstance {
|
||||
accessKey;
|
||||
secretKey;
|
||||
uploadHost; //七牛上传url
|
||||
bucket;
|
||||
domain;
|
||||
constructor(config) {
|
||||
const { accessKey, secretKey, uploadHost, bucket, domain } = config;
|
||||
this.accessKey = accessKey;
|
||||
this.secretKey = secretKey;
|
||||
this.uploadHost = uploadHost;
|
||||
this.bucket = bucket;
|
||||
this.domain = domain;
|
||||
}
|
||||
async getUploadInfo(fileName) {
|
||||
try {
|
||||
const { uploadHost, domain, bucket } = this;
|
||||
const key = `${Date.now()}/${fileName}`;
|
||||
const scope = `${bucket}:${key}`;
|
||||
const uploadToken = this.getToken(scope);
|
||||
return {
|
||||
key,
|
||||
uploadToken,
|
||||
uploadHost,
|
||||
bucket,
|
||||
domain,
|
||||
};
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
getToken(scope) {
|
||||
// 构造策略
|
||||
const putPolicy = {
|
||||
scope: scope,
|
||||
deadline: 3600 + Math.floor(Date.now() / 1000),
|
||||
};
|
||||
// 构造凭证
|
||||
const encodedFlags = this.urlSafeBase64Encode(JSON.stringify(putPolicy));
|
||||
const encoded = this.hmacSha1(encodedFlags, this.secretKey);
|
||||
const encodedSign = this.base64ToUrlSafe(encoded);
|
||||
const uploadToken = this.accessKey + ':' + encodedSign + ':' + encodedFlags;
|
||||
return uploadToken;
|
||||
}
|
||||
base64ToUrlSafe(v) {
|
||||
return v.replace(/\//g, '_').replace(/\+/g, '-');
|
||||
}
|
||||
hmacSha1(encodedFlags, secretKey) {
|
||||
const hmac = crypto_1.default.createHmac('sha1', secretKey);
|
||||
hmac.update(encodedFlags);
|
||||
return hmac.digest('base64');
|
||||
}
|
||||
urlSafeBase64Encode(jsonFlags) {
|
||||
const encoded = buffer_1.Buffer.from(jsonFlags).toString('base64');
|
||||
return this.base64ToUrlSafe(encoded);
|
||||
}
|
||||
}
|
||||
exports.default = qiniuInstance;
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
import { EntityDict } from 'oak-app-domain';
|
||||
import { SelectRowShape } from 'oak-domain/lib/types/Entity';
|
||||
|
||||
function select<T extends keyof EntityDict, P extends EntityDict[T]['Selection']['data']>(entity: T, proj: P): SelectRowShape<EntityDict[T]['Schema'], P> {
|
||||
throw new Error('method not implemented');
|
||||
}
|
||||
|
||||
const r = select('address', {
|
||||
id: 1,
|
||||
name: 1,
|
||||
detail: 1,
|
||||
area: {
|
||||
id: 1,
|
||||
name: 1,
|
||||
},
|
||||
$expr10: {
|
||||
$abs: 10,
|
||||
},
|
||||
});
|
||||
|
||||
r.area.name
|
||||
|
||||
Loading…
Reference in New Issue