cos 天翼云

This commit is contained in:
wkj 2023-11-21 16:02:53 +08:00
parent af98de9b3e
commit 096ace64db
35 changed files with 285 additions and 77 deletions

View File

@ -1,2 +1,2 @@
declare const checkers: (import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt>)[];
declare const checkers: (import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt>)[];
export default checkers;

View File

@ -40,16 +40,28 @@
.@{component}__item-image {
display: block;
width: 22px;
height: 22px;
width: 48rpx;
height: 48rpx;
}
.@{component}__item-text {
margin-top: 4rpx;
font-size: 24rpx;
line-height: 1;
color: #666;
text-align: center;
font-family: "PingFang SC";
font-size: 20rpx;
font-style: normal;
font-weight: 500;
line-height: normal;
letter-spacing: -0.48rpx;
}
.@{component}__item--selected {
color: @oak-color-primary;
text-align: center;
font-family: "PingFang SC";
font-size: 20rpx;
font-style: normal;
font-weight: 500;
line-height: normal;
letter-spacing: -0.48rpx;
}

View File

@ -6,18 +6,18 @@
<l-badge show="{{item.redDot}}" dot="{{item.redDot===true}}" value="{{item.redDot}}" data-index="{{index}}" mut-bind:lintap="onTapItem">
<block wx:if="{{selectedIndex===index}}">
<block wx:if="{{item.selectedIconPath}}">
<image class="tab-bar__item-image" src={{item.selectedIconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'px;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'px;' : ''}}" />
<image class="tab-bar__item-image" src={{item.selectedIconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'rpx;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'rpx;' : ''}}" />
</block>
<block wx:else>
<oak-icon name="{{item.selectedIconName}}" size="{{item.iconSize || 22}}" color="{{selectedColor}}" />
<oak-icon name="{{item.selectedIconName}}" size="{{item.iconSize || 24}}" color="{{selectedColor}}" />
</block>
</block>
<block wx:else>
<block wx:if="{{item.iconPath}}">
<image class="tab-bar__item-image" src={{item.iconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'px;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'px;' : ''}}" />
<image class="tab-bar__item-image" src={{item.iconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'rpx;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'rpx;' : ''}}" />
</block>
<block wx:else>
<oak-icon name="{{item.iconName}}" size="{{item.iconSize || 22}}" color="{{color}}" />
<oak-icon name="{{item.iconName}}" size="{{item.iconSize || 24}}" color="{{color}}" />
</block>
</block>

View File

@ -2,7 +2,7 @@
import { Style } from '../../../../types/Style';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../../oak-app-domain").EntityDict, keyof import("../../../../oak-app-domain").EntityDict, false, {
style: Style;
entity: "system" | "application" | "platform";
entity: "application" | "platform" | "system";
entityId: string;
name: string;
}>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;

View File

@ -2,7 +2,7 @@
import { Config } from '../../../types/Config';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, keyof import("../../../oak-app-domain").EntityDict, false, {
config: Config;
entity: "system" | "platform";
entity: "platform" | "system";
name: string;
entityId: string;
}>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;

View File

@ -13,9 +13,9 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
type?: ButtonProps['type'] | AmButtonProps['type'];
executeText?: string | undefined;
buttonProps?: (ButtonProps & {
color?: "primary" | "success" | "warning" | "default" | "danger" | undefined;
color?: "default" | "success" | "warning" | "primary" | "danger" | undefined;
fill?: "none" | "solid" | "outline" | undefined;
size?: "small" | "large" | "middle" | "mini" | undefined;
size?: "small" | "middle" | "large" | "mini" | undefined;
block?: boolean | undefined;
loading?: boolean | "auto" | undefined;
loadingText?: string | undefined;
@ -25,7 +25,7 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
type?: "button" | "reset" | "submit" | undefined;
shape?: "default" | "rounded" | "rectangular" | undefined;
children?: import("react").ReactNode;
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseUp" | "onMouseDown" | "onTouchStart" | "onTouchEnd"> & {
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchStart" | "onTouchEnd"> & {
className?: string | undefined;
style?: (import("react").CSSProperties & Partial<Record<"--text-color" | "--background-color" | "--border-radius" | "--border-width" | "--border-style" | "--border-color", string>>) | undefined;
tabIndex?: number | undefined;

View File

@ -1,5 +1,6 @@
import { assert } from 'oak-domain/lib/utils/assert';
export default OakComponent({
isList: false,
formData({ features }) {
const ids = this.getEfIds();
const states = ids.map((id) => features.extraFile.getFileState(id));

View File

@ -1,4 +1,4 @@
/// <reference types="wechat-miniprogram" />
/// <reference types="react" />
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, "message", false, WechatMiniprogram.Component.DataOption>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, keyof import("../../../oak-app-domain").EntityDict, boolean, WechatMiniprogram.Component.DataOption>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
export default _default;

View File

@ -1,23 +1,23 @@
export default OakComponent({
isList: false,
entity: 'message',
projection: {
id: 1,
$$createAt$$: 1,
type: 1,
title: 1,
content: 1,
visitState: 1,
userId: 1,
user: {
id: 1,
name: 1,
},
router: 1,
},
formData: function ({ data: message, features, props }) {
return message || {};
},
methods: {},
actions: ['visit'],
// isList: false,
// entity: 'message',
// projection: {
// id: 1,
// $$createAt$$: 1,
// type: 1,
// title: 1,
// content: 1,
// visitState: 1,
// userId: 1,
// user: {
// id: 1,
// name: 1,
// },
// router: 1,
// },
// formData: function ({ data: message, features, props }) {
// return message || {};
// },
// methods: {},
// actions: ['visit'],
});

View File

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

View File

@ -4,7 +4,7 @@ import dayjs from 'dayjs';
import Style from './web.module.less';
export default function Render(props) {
const { data, methods } = props;
const { id, router, title, type, $$createAt$$, visitState, oakLegalActions, onItemClicked, } = data;
const { id, router, title, type, $$createAt$$, visitState, oakLegalActions, onItemClicked, visit, } = data;
const { navigateTo, execute } = methods;
return (_jsxs("div", { className: Style.list, onClick: onItemClicked
? () => {
@ -14,7 +14,8 @@ export default function Render(props) {
});
}
: undefined, children: [_jsxs("div", { className: Style.list__notify, children: [visitState === 'unvisited' && (_jsx(Badge, { style: { marginRight: 5 }, status: "processing" })), _jsx("div", { className: Style.notify_deadline, children: title }), oakLegalActions?.includes('visit') && (_jsx("div", { className: Style.notify_mask, onClick: (event) => {
execute('visit', false);
// execute('visit', false);
visit(id);
event.stopPropagation();
}, children: "\u6807\u8BB0\u5DF2\u8BFB" }))] }), _jsx("div", { className: Style.list__info, children: _jsx("div", { className: Style.create_time, children: dayjs($$createAt$$).format('YYYY-MM-DD HH:mm:ss') }) })] }));
}

View File

@ -5,9 +5,10 @@ export default function Render(props) {
const { data, methods } = props;
const { messages, oakFullpath } = data;
const { goDetailById } = methods;
return (_jsx(_Fragment, { children: messages?.length > 0 ? (_jsx("div", { children: messages?.map((message, index) => (_jsx(MessageCell, { oakId: message.id, oakPath: oakFullpath
? `${oakFullpath}.${message.id}`
: '', onItemClicked: (item) => {
return (_jsx(_Fragment, { children: messages?.length > 0 ? (_jsx("div", { children: messages?.map((message, index) => (_jsx(MessageCell, { oakId: message.id, onItemClicked: (item) => {
goDetailById(item.id);
}, title: message.title, router: message.router, id: message.id, visitState: message.visitState, visit: (id) => {
methods.updateItem({}, id, 'visit');
methods.execute(undefined, false);
} }, message.id))) })) : (_jsx(Empty, { description: "\u6682\u65E0\u6D88\u606F", image: Empty.PRESENTED_IMAGE_SIMPLE })) }));
}

View File

@ -6,11 +6,12 @@ export default function Render(props) {
const { data, methods } = props;
const { messages, open, onClose, oakFullpath } = data;
const { goDetailById, goMessageList } = methods;
return (_jsx(_Fragment, { children: messages?.length > 0 ? (_jsx("div", { children: messages?.map((message, index) => (_jsx(MessageCell, { oakId: message.id, oakPath: oakFullpath
? `${oakFullpath}.${message.id}`
: '', onItemClicked: (item) => {
return (_jsx(_Fragment, { children: messages?.length > 0 ? (_jsx("div", { children: messages?.map((message, index) => (_jsx(MessageCell, { oakId: message.id, onItemClicked: (item) => {
const { id } = item;
onClose && onClose();
goDetailById(id);
}, title: message.title, router: message.router, id: message.id, visitState: message.visitState, visit: (id) => {
methods.updateItem({}, id, 'visit');
methods.execute(undefined, false);
} }, message.id))) })) : (_jsx("div", { className: Style.noData, children: _jsx(Empty, { description: "\u6682\u65E0\u6D88\u606F", image: Empty.PRESENTED_IMAGE_SIMPLE }) })) }));
}

View File

@ -1,7 +1,7 @@
/// <reference types="react" />
import { EntityDict } from '../../../oak-app-domain';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, false, {
type: "bind" | "login";
type: "login" | "bind";
url: string;
}>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
export default _default;

View File

@ -4,9 +4,4 @@
.safe-area-inset-bottom() {
padding-bottom: constant(safe-area-inset-bottom) !important; /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom) !important; /* 兼容 iOS >= 11.2 */
}
.safe-area-outset-bottom() {
margin-bottom: constant(safe-area-inset-bottom) !important; /* 兼容 iOS < 11.2 */
margin-bottom: env(safe-area-inset-bottom) !important; /* 兼容 iOS >= 11.2 */
}
}

View File

@ -152,7 +152,7 @@ export class ExtraFile extends Feature {
const { origin, extra1 } = extraFile;
if (origin === 'unknown') {
return extra1 || '';
}
}
const cos = getCos(origin);
const context = this.cache.begin();
this.cache.commit();

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "account", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "account", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
export default _default;

20
es/types/Config.d.ts vendored
View File

@ -1,8 +1,12 @@
import { QiniuZone } from 'oak-external-sdk';
import { QiniuZone, CTYunZone } from 'oak-external-sdk';
export type QiniuCloudConfig = {
accessKey: string;
secretKey: string;
};
export type CTYunConfig = {
accessKey: string;
secretKey: string;
};
export type QiniuLiveConfig = {
accessKey: string;
liveHost: string;
@ -23,6 +27,16 @@ export type QiniuCosConfig = {
}[];
defaultBucket: string;
};
export type CTYunCosConfig = {
accessKey: string;
buckets: {
zone: CTYunZone;
name: string;
domain: string;
protocol: string | string[];
}[];
defaultBucket: string;
};
export type AmapMapConfig = {
webApiKey: string;
};
@ -67,10 +81,12 @@ export type Config = {
ali?: AliCloudConfig[];
tencent?: TencentCloudConfig[];
qiniu?: QiniuCloudConfig[];
ctyun?: CTYunConfig[];
amap?: AmapCloudConfig[];
};
Cos?: {
qiniu?: QiniuCosConfig;
ctyun?: CTYunCosConfig;
};
Live?: {
qiniu?: QiniuLiveConfig;
@ -91,5 +107,5 @@ export type Config = {
mergeUserDirectly?: boolean;
};
};
export type Origin = 'ali' | 'tencent' | 'qiniu' | 'amap';
export type Origin = 'ali' | 'tencent' | 'qiniu' | 'amap' | 'ctyun';
export type Service = 'Map' | 'Cos' | 'Live' | 'Sms';

View File

@ -4,6 +4,15 @@ export type QiniuUploadInfo = {
uploadHost: string;
bucket: string;
};
export type CTYunUploadInfo = {
key?: string;
accessKey: string;
uploadToken: string;
uploadHost: string;
policy: string;
signature: string;
bucket: string;
};
export type AliyunUploadInfo = {
key?: string;
signature: string;

16
es/utils/cos/ctyun.d.ts vendored Normal file
View File

@ -0,0 +1,16 @@
import { ED, BRC, FRC } from '../../types/RuntimeCxt';
import Cos from "../../types/Cos";
import { OpSchema } from '../../oak-app-domain/ExtraFile/Schema';
export default class CTYun implements Cos<ED, BRC, FRC> {
name: string;
autoInform(): boolean;
private formKey;
formUploadMeta(extraFile: OpSchema, context: BRC): Promise<void>;
upload(extraFile: OpSchema, uploadFn: (file: File | string, name: string, // 文件的part name
uploadUrl: string, // 上传的url
formData: Record<string, any>, // 上传的其它part参数
autoInform?: boolean) => Promise<any>, file: string | File): Promise<void>;
composeFileUrl(extraFile: ED['extraFile']['OpSchema'], context: FRC, style?: string): string;
checkWhetherSuccess(extraFile: OpSchema, context: BRC): Promise<boolean>;
removeFile(extraFile: OpSchema, context: BRC): Promise<void>;
}

93
es/utils/cos/ctyun.js Normal file
View File

@ -0,0 +1,93 @@
import { assert } from 'oak-domain/lib/utils/assert';
import { getConfig } from '../getContextConfig';
import { OakUploadException } from '../../types/Exception';
import { OakNetworkException } from 'oak-domain';
export default class CTYun {
name = 'ctyun';
autoInform() {
return false;
}
formKey(extraFile) {
const { id, extension, objectId } = extraFile;
assert(objectId);
return `extraFile/${objectId}${extension ? '.' + extension : ''}`;
}
async formUploadMeta(extraFile, context) {
const { bucket } = extraFile;
// 构造文件上传所需的key
const key = this.formKey(extraFile);
const { instance, config } = getConfig(context, 'Cos', 'ctyun');
const { buckets } = config;
let bucket2 = bucket;
if (!bucket2) {
const { defaultBucket } = config;
bucket2 = defaultBucket;
}
assert(bucket2);
const b = buckets.find(ele => ele.name === bucket2);
assert(b, `${bucket2}不是一个有效的桶配置`);
Object.assign(extraFile, {
bucket: bucket2,
uploadMeta: instance.getUploadInfo(bucket2, b.zone, key),
});
}
async upload(extraFile, uploadFn, file) {
const uploadMeta = extraFile.uploadMeta;
let result;
try {
result = await uploadFn(file, 'file', uploadMeta.uploadHost, {
Key: uploadMeta.key,
Policy: uploadMeta.policy,
AWSAccessKeyId: uploadMeta.accessKey,
signature: uploadMeta.signature,
}, true);
}
catch (err) {
// 网络错误
throw new OakNetworkException('网络异常,请求失败');
}
let isSuccess = false;
if (process.env.OAK_PLATFORM === 'wechatMp') {
// 小程序端上传 使用wx.uploadFile
if (result.errMsg === 'uploadFile:ok') {
const jsonData = JSON.parse(result.data);
isSuccess = !!jsonData.key;
}
}
else {
isSuccess = !!(result.success === true || result.key);
}
// 解析回调
if (isSuccess) {
return;
}
else {
throw new OakUploadException('图片上传七牛失败');
}
}
composeFileUrl(extraFile, context, style) {
const { config } = getConfig(context, 'Cos', 'qiniu');
if (config) {
let bucket = config.buckets.find((ele) => ele.name === extraFile.bucket);
if (bucket) {
const { domain, protocol } = bucket;
let protocol2 = protocol;
if (protocol instanceof Array) {
// protocol存在https 说明域名有证书
const index = protocol.includes('https')
? protocol.findIndex((ele) => ele === 'https')
: 0;
protocol2 = protocol[index];
}
return `${protocol2}://${domain}/${this.formKey(extraFile)}`;
}
}
return '';
}
async checkWhetherSuccess(extraFile, context) {
return true;
}
async removeFile(extraFile, context) {
}
}
;

View File

@ -1,11 +1,14 @@
import { assert } from 'oak-domain/lib/utils/assert';
import Qiniu from './qiniu';
import Wechat from './wechat';
import CTYun from './ctyun';
const ctyun = new CTYun();
const qiniu = new Qiniu();
const wechat = new Wechat();
const CosDict = {
[qiniu.name]: qiniu,
[wechat.name]: wechat,
[ctyun.name]: ctyun,
};
/**
* 注入一个其它OSS上实现的uploader类

View File

@ -12,6 +12,9 @@ import { ED as EntityDict } from '../types/RuntimeCxt';
export declare function getConfig<ED extends EntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED, Cxt, AspectDict<ED, Cxt>>>(context: Cxt | FrontCxt, service: Service, origin: Origin): {
instance: import("oak-external-sdk").QiniuCloudInstance;
config: any;
} | {
instance: import("oak-external-sdk").CTYunInstance;
config: any;
} | {
instance: import("oak-external-sdk").AmapInstance;
config: any;

View File

@ -1,6 +1,6 @@
import { assert } from 'oak-domain/lib/utils/assert';
import { OakDataException } from 'oak-domain/lib/types/Exception';
import { AmapSDK, QiniuSDK } from 'oak-external-sdk';
import { AmapSDK, QiniuSDK, CTYunSDk } from 'oak-external-sdk';
/**
* 目前虽然数据结构上config也可能在platform上但是实际中暂时还没有
* @param context
@ -45,6 +45,15 @@ export function getConfig(context, service, origin) {
config: originConfig,
};
}
case 'ctyun': {
const ctyunAccount = originCloudAccounts.find((ele) => ele.accessKey === originConfig.accessKey);
assert(ctyunAccount, `调用的服务${service}${origin}找不到相应的云平台帐号,请联系管理员`);
const ctyunInstance = CTYunSDk.getInstance(ctyunAccount.accessKey, ctyunAccount.secretKey);
return {
instance: ctyunInstance,
config: originConfig,
};
}
default: {
assert(origin === 'amap');
const amapAccount = originCloudAccounts.find((ele) => ele.webApiKey === originConfig.webApiKey);

View File

@ -1,2 +1,2 @@
declare const checkers: (import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt>)[];
declare const checkers: (import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt> | import("oak-domain").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt>)[];
export default checkers;

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "account", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain").Trigger<import("../oak-app-domain").EntityDict, "account", import("..").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
export default _default;

20
lib/types/Config.d.ts vendored
View File

@ -1,8 +1,12 @@
import { QiniuZone } from 'oak-external-sdk';
import { QiniuZone, CTYunZone } from 'oak-external-sdk';
export type QiniuCloudConfig = {
accessKey: string;
secretKey: string;
};
export type CTYunConfig = {
accessKey: string;
secretKey: string;
};
export type QiniuLiveConfig = {
accessKey: string;
liveHost: string;
@ -23,6 +27,16 @@ export type QiniuCosConfig = {
}[];
defaultBucket: string;
};
export type CTYunCosConfig = {
accessKey: string;
buckets: {
zone: CTYunZone;
name: string;
domain: string;
protocol: string | string[];
}[];
defaultBucket: string;
};
export type AmapMapConfig = {
webApiKey: string;
};
@ -67,10 +81,12 @@ export type Config = {
ali?: AliCloudConfig[];
tencent?: TencentCloudConfig[];
qiniu?: QiniuCloudConfig[];
ctyun?: CTYunConfig[];
amap?: AmapCloudConfig[];
};
Cos?: {
qiniu?: QiniuCosConfig;
ctyun?: CTYunCosConfig;
};
Live?: {
qiniu?: QiniuLiveConfig;
@ -91,5 +107,5 @@ export type Config = {
mergeUserDirectly?: boolean;
};
};
export type Origin = 'ali' | 'tencent' | 'qiniu' | 'amap';
export type Origin = 'ali' | 'tencent' | 'qiniu' | 'amap' | 'ctyun';
export type Service = 'Map' | 'Cos' | 'Live' | 'Sms';

View File

@ -4,6 +4,15 @@ export type QiniuUploadInfo = {
uploadHost: string;
bucket: string;
};
export type CTYunUploadInfo = {
key?: string;
accessKey: string;
uploadToken: string;
uploadHost: string;
policy: string;
signature: string;
bucket: string;
};
export type AliyunUploadInfo = {
key?: string;
signature: string;

View File

@ -5,11 +5,14 @@ const tslib_1 = require("tslib");
const assert_1 = require("oak-domain/lib/utils/assert");
const qiniu_1 = tslib_1.__importDefault(require("./qiniu"));
const wechat_1 = tslib_1.__importDefault(require("./wechat"));
const ctyun_1 = tslib_1.__importDefault(require("./ctyun"));
const ctyun = new ctyun_1.default();
const qiniu = new qiniu_1.default();
const wechat = new wechat_1.default();
const CosDict = {
[qiniu.name]: qiniu,
[wechat.name]: wechat,
[ctyun.name]: ctyun,
};
/**
* 注入一个其它OSS上实现的uploader类

View File

@ -12,6 +12,9 @@ import { ED as EntityDict } from '../types/RuntimeCxt';
export declare function getConfig<ED extends EntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED, Cxt, AspectDict<ED, Cxt>>>(context: Cxt | FrontCxt, service: Service, origin: Origin): {
instance: import("oak-external-sdk").QiniuCloudInstance;
config: any;
} | {
instance: import("oak-external-sdk").CTYunInstance;
config: any;
} | {
instance: import("oak-external-sdk").AmapInstance;
config: any;

View File

@ -48,6 +48,15 @@ function getConfig(context, service, origin) {
config: originConfig,
};
}
case 'ctyun': {
const ctyunAccount = originCloudAccounts.find((ele) => ele.accessKey === originConfig.accessKey);
(0, assert_1.assert)(ctyunAccount, `调用的服务${service}${origin}找不到相应的云平台帐号,请联系管理员`);
const ctyunInstance = oak_external_sdk_1.CTYunSDk.getInstance(ctyunAccount.accessKey, ctyunAccount.secretKey);
return {
instance: ctyunInstance,
config: originConfig,
};
}
default: {
(0, assert_1.assert)(origin === 'amap');
const amapAccount = originCloudAccounts.find((ele) => ele.webApiKey === originConfig.webApiKey);

View File

@ -122,7 +122,7 @@ export async function createSession<
{}
);
const sessionMessage = {
const sessionMessage: EntityDict['sessionMessage']['Update']['data'] = {
id: await generateNewIdAsync(),
applicationId: entityId,
wechatUserId: wechatUser?.id,

View File

@ -40,16 +40,28 @@
.@{component}__item-image {
display: block;
width: 22px;
height: 22px;
width: 48rpx;
height: 48rpx;
}
.@{component}__item-text {
margin-top: 4rpx;
font-size: 24rpx;
line-height: 1;
color: #666;
text-align: center;
font-family: "PingFang SC";
font-size: 20rpx;
font-style: normal;
font-weight: 500;
line-height: normal;
letter-spacing: -0.48rpx;
}
.@{component}__item--selected {
color: @oak-color-primary;
text-align: center;
font-family: "PingFang SC";
font-size: 20rpx;
font-style: normal;
font-weight: 500;
line-height: normal;
letter-spacing: -0.48rpx;
}

View File

@ -6,18 +6,18 @@
<l-badge show="{{item.redDot}}" dot="{{item.redDot===true}}" value="{{item.redDot}}" data-index="{{index}}" mut-bind:lintap="onTapItem">
<block wx:if="{{selectedIndex===index}}">
<block wx:if="{{item.selectedIconPath}}">
<image class="tab-bar__item-image" src={{item.selectedIconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'px;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'px;' : ''}}" />
<image class="tab-bar__item-image" src={{item.selectedIconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'rpx;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'rpx;' : ''}}" />
</block>
<block wx:else>
<oak-icon name="{{item.selectedIconName}}" size="{{item.iconSize || 22}}" color="{{selectedColor}}" />
<oak-icon name="{{item.selectedIconName}}" size="{{item.iconSize || 24}}" color="{{selectedColor}}" />
</block>
</block>
<block wx:else>
<block wx:if="{{item.iconPath}}">
<image class="tab-bar__item-image" src={{item.iconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'px;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'px;' : ''}}" />
<image class="tab-bar__item-image" src={{item.iconPath}} style="{{item.iconSize ? 'width: '+item.iconSize+ 'rpx;' : ''}} {{item.iconSize ? 'height: '+item.iconSize+ 'rpx;' : ''}}" />
</block>
<block wx:else>
<oak-icon name="{{item.iconName}}" size="{{item.iconSize || 22}}" color="{{color}}" />
<oak-icon name="{{item.iconName}}" size="{{item.iconSize || 24}}" color="{{color}}" />
</block>
</block>

View File

@ -4,9 +4,4 @@
.safe-area-inset-bottom() {
padding-bottom: constant(safe-area-inset-bottom) !important; /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom) !important; /* 兼容 iOS >= 11.2 */
}
.safe-area-outset-bottom() {
margin-bottom: constant(safe-area-inset-bottom) !important; /* 兼容 iOS < 11.2 */
margin-bottom: env(safe-area-inset-bottom) !important; /* 兼容 iOS >= 11.2 */
}
}