cos 天翼云
This commit is contained in:
parent
af98de9b3e
commit
096ace64db
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>>;
|
||||
|
|
|
|||
|
|
@ -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>>;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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') }) })] }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 })) }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }) })) }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
;
|
||||
|
|
@ -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类
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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类
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ export async function createSession<
|
|||
{}
|
||||
);
|
||||
|
||||
const sessionMessage = {
|
||||
const sessionMessage: EntityDict['sessionMessage']['Update']['data'] = {
|
||||
id: await generateNewIdAsync(),
|
||||
applicationId: entityId,
|
||||
wechatUserId: wechatUser?.id,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue