mobile端身份认证 及mobile绑定样式
This commit is contained in:
parent
1c13ecc25a
commit
6ea5255a43
|
|
@ -2,7 +2,6 @@ import WechatSDK from 'oak-external-sdk/lib/WechatSDK';
|
|||
import { assert } from 'oak-domain/lib/utils/assert';
|
||||
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
|
||||
import { OakExternalException } from 'oak-domain/lib/types/Exception';
|
||||
|
||||
async function getWechatPublicConfig(applicationId, context) {
|
||||
const [application] = await context.select('application', {
|
||||
data: {
|
||||
|
|
@ -49,15 +48,14 @@ export async function getMenu(params, context) {
|
|||
try {
|
||||
const result = await wechatInstance.getMenu();
|
||||
return result;
|
||||
} catch (e) {
|
||||
if (
|
||||
e instanceof OakExternalException &&
|
||||
e?.message?.includes('menu no exist')
|
||||
) {
|
||||
}
|
||||
catch (e) {
|
||||
if (e instanceof OakExternalException &&
|
||||
e?.message?.includes('menu no exist')) {
|
||||
return {
|
||||
menu: {
|
||||
button: [],
|
||||
},
|
||||
button: []
|
||||
}
|
||||
};
|
||||
}
|
||||
throw e;
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default checkers;
|
||||
|
|
|
|||
|
|
@ -13,19 +13,19 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
|
|||
type?: ButtonProps['type'] | AmButtonProps['type'];
|
||||
executeText?: string | undefined;
|
||||
buttonProps?: (ButtonProps & {
|
||||
color?: "success" | "default" | "warning" | "primary" | "danger" | undefined;
|
||||
color?: "default" | "success" | "warning" | "primary" | "danger" | undefined;
|
||||
fill?: "none" | "solid" | "outline" | undefined;
|
||||
size?: "small" | "middle" | "large" | "mini" | undefined;
|
||||
size?: "small" | "large" | "middle" | "mini" | undefined;
|
||||
block?: boolean | undefined;
|
||||
loading?: boolean | "auto" | undefined;
|
||||
loadingText?: string | undefined;
|
||||
loadingIcon?: import("react").ReactNode;
|
||||
disabled?: boolean | undefined;
|
||||
onClick?: ((event: import("react").MouseEvent<HTMLButtonElement, MouseEvent>) => unknown) | undefined;
|
||||
type?: "button" | "reset" | "submit" | undefined;
|
||||
type?: "button" | "submit" | "reset" | undefined;
|
||||
shape?: "default" | "rounded" | "rectangular" | undefined;
|
||||
children?: import("react").ReactNode;
|
||||
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchStart" | "onTouchEnd"> & {
|
||||
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchEnd" | "onTouchStart"> & {
|
||||
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,22 +1,15 @@
|
|||
|
||||
|
||||
.loginbox-main {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
background: var(--oak-bg-color-container);
|
||||
padding-top: 20%;
|
||||
}
|
||||
|
||||
.loginbox-wrap {
|
||||
width: 90%;
|
||||
display: block;
|
||||
background: var(--oak-bg-color-container);
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 4px rgb(0 0 0 / 8%), 0 0 4px rgb(0 0 0 / 8%);
|
||||
}
|
||||
|
||||
.loginbox-hd {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, "mobile", true, {
|
||||
onFinish: (() => void) | undefined;
|
||||
bindNum: number;
|
||||
addMobile: (() => void) | undefined;
|
||||
}>) => React.ReactElement;
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ export default OakComponent({
|
|||
properties: {
|
||||
onFinish: undefined,
|
||||
bindNum: 10,
|
||||
addMobile: undefined,
|
||||
},
|
||||
methods: {
|
||||
async onRefreshMobile(e) {
|
||||
|
|
@ -86,9 +87,11 @@ export default OakComponent({
|
|||
});
|
||||
},
|
||||
goAddMobile() {
|
||||
this.navigateTo({
|
||||
url: '/mobile/login',
|
||||
});
|
||||
const { addMobile } = this.props;
|
||||
if (addMobile) {
|
||||
addMobile();
|
||||
return;
|
||||
}
|
||||
},
|
||||
async onRemoveConfirm() {
|
||||
const { mobileId } = this.state;
|
||||
|
|
|
|||
|
|
@ -1,14 +1,17 @@
|
|||
import React from 'react';
|
||||
import { List, Button, Dialog } from 'antd-mobile';
|
||||
import React, { useState } from 'react';
|
||||
import { List, Button, Popup, Dialog } from 'antd-mobile';
|
||||
import { MobileOutlined, DeleteOutlined } from '@ant-design/icons';
|
||||
import Style from './mobile.module.less';
|
||||
import MobileLogin from '../login';
|
||||
export default function render(props) {
|
||||
const { mobiles, allowRemove, tokenMobileId } = props.data;
|
||||
const { goAddMobile, removeItem, recoverItem, execute } = props.methods;
|
||||
const [open, setOpen] = useState(false);
|
||||
return (<div className={Style.container}>
|
||||
{mobiles && mobiles.length > 0 ? (<>
|
||||
<List className={Style.list}>
|
||||
{mobiles?.map((ele, index) => (<List.Item key={index} prefix={<MobileOutlined />} extra={allowRemove && tokenMobileId !== ele.id && (<div onClick={async () => {
|
||||
{mobiles?.map((ele, index) => (<List.Item key={index} prefix={<MobileOutlined />} extra={allowRemove &&
|
||||
tokenMobileId !== ele.id && (<div onClick={async () => {
|
||||
const result = await Dialog.confirm({
|
||||
content: '确认删除吗?删除后无法用此号码登录',
|
||||
});
|
||||
|
|
@ -33,8 +36,20 @@ export default function render(props) {
|
|||
<span>尚未绑定手机号</span>
|
||||
</div>)}
|
||||
|
||||
<Button block size="large" color="primary" onClick={() => goAddMobile()}>
|
||||
<Button block size="large" color="primary" onClick={() => setOpen(true)}>
|
||||
绑定
|
||||
</Button>
|
||||
|
||||
<Popup visible={open} showCloseButton={true} onClose={() => {
|
||||
setOpen(false);
|
||||
}} bodyStyle={{
|
||||
borderTopLeftRadius: '8px',
|
||||
borderTopRightRadius: '8px',
|
||||
height: '40vh',
|
||||
}}>
|
||||
<MobileLogin callback={() => {
|
||||
setOpen(false);
|
||||
}} oakPath="$mobile/me-mobile/login" oakAutoUnmount={true}/>
|
||||
</Popup>
|
||||
</div>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,54 +1,16 @@
|
|||
.addView {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
left: 50%;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.imgView {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.img {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
.pageBody {
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.imgContent {
|
||||
padding: 16px;
|
||||
margin: 16px;
|
||||
border-radius: 8px;
|
||||
background-color: var(--oak-bg-color-page);
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: #fff;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.circleBtn {
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--oak-color-primary);
|
||||
}
|
||||
|
||||
.buttonView {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
justify-content: flex-end;
|
||||
padding: 16px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
|
@ -1,13 +1,17 @@
|
|||
import React from 'react';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from '../../../oak-app-domain';
|
||||
import type { UploadFile } from 'antd/es/upload/interface';
|
||||
export default function Render(props: WebComponentProps<EntityDict, 'user', false, {
|
||||
userId: string;
|
||||
name: string;
|
||||
idNumber: string;
|
||||
idState: EntityDict['user']['Schema']['idState'];
|
||||
idCardType: EntityDict['user']['Schema']['idCardType'];
|
||||
idCardTypeArr: {
|
||||
value: string;
|
||||
label: string;
|
||||
}[];
|
||||
showBtn: boolean;
|
||||
}, {
|
||||
commit: (file1: UploadFile, file2: UploadFile) => void;
|
||||
prevImg: (file: UploadFile, id: string) => void;
|
||||
onChange: (attr: keyof EntityDict['user']['Schema'], value: string) => void;
|
||||
}>): null;
|
||||
onConfirm: () => void;
|
||||
}>): React.JSX.Element;
|
||||
|
|
|
|||
|
|
@ -1,104 +1,52 @@
|
|||
import React, { useState } from 'react';
|
||||
import Styles from './mobile.module.less';
|
||||
import { Picker, Form, Input, Button } from 'antd-mobile';
|
||||
export default function Render(props) {
|
||||
const { methods, data } = props;
|
||||
const { t, onChange, prevImg, commit } = methods;
|
||||
// const { oakFullpath, oakId, oakLegalActions, userId, idState, name, idNumber } = data;
|
||||
// const [fileList, setFileList] = useState<UploadFile[]>([]);
|
||||
// const [fileList2, setFileList2] = useState<UploadFile[]>([]);
|
||||
// const uploadProps: UploadProps = {
|
||||
// maxCount: 1,
|
||||
// showUploadList: false,
|
||||
// beforeUpload: (file) => {
|
||||
// return false;
|
||||
// },
|
||||
// onChange: ({ file, fileList, event }) => {
|
||||
// prevImg(file, 'imgView1');
|
||||
// setFileList([...fileList]);
|
||||
// },
|
||||
// fileList,
|
||||
// };
|
||||
// const uploadProps2: UploadProps = {
|
||||
// maxCount: 1,
|
||||
// showUploadList: false,
|
||||
// beforeUpload: (file) => {
|
||||
// return false;
|
||||
// },
|
||||
// onChange: ({ file, fileList, event }) => {
|
||||
// prevImg(file, 'imgView2');
|
||||
// setFileList2([...fileList]);
|
||||
// },
|
||||
// fileList: fileList2,
|
||||
// };
|
||||
// if (idState === 'verified') {
|
||||
// return (
|
||||
// <Result
|
||||
// status='success'
|
||||
// title={t("Real name verification passed")}
|
||||
// />
|
||||
// )
|
||||
// }
|
||||
return null;
|
||||
// return (
|
||||
// <div className={styles.container}>
|
||||
// <div className={styles.imgContent}>
|
||||
// <Upload {...uploadProps}>
|
||||
// <div id="imgView1" className={styles.imgView} style={{ marginBottom: 16 }}>
|
||||
// <IDCard1 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
|
||||
// {/* <img id="img1" className={styles.img} /> */}
|
||||
// {fileList.length === 0 && (
|
||||
// <Space direction="vertical" className={styles.addView} align="center">
|
||||
// <div className={styles.circleBtn}>
|
||||
// <AddOutline color="#fff" />
|
||||
// </div>
|
||||
// <div className={styles.text}>
|
||||
// {t("Identity witness profile")}
|
||||
// </div>
|
||||
// </Space>
|
||||
// )}
|
||||
// </div>
|
||||
// </Upload>
|
||||
// <Upload {...uploadProps2}>
|
||||
// <div id="imgView2" className={styles.imgView}>
|
||||
// <IDCard2 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
|
||||
// {/* <img id="img2" className={styles.img} /> */}
|
||||
// {fileList2.length === 0 && (
|
||||
// <Space direction="vertical" className={styles.addView} align="center">
|
||||
// <div className={styles.circleBtn}>
|
||||
// <AddOutline color="#fff" />
|
||||
// </div>
|
||||
// <div className={styles.text}>
|
||||
// {t("Identity national emblem profile")}
|
||||
// </div>
|
||||
// </Space>
|
||||
// )}
|
||||
// </div>
|
||||
// </Upload>
|
||||
// </div>
|
||||
// <Form layout='horizontal'>
|
||||
// <Form.Item label={t("user:attr.name")}>
|
||||
// <Input
|
||||
// value={name}
|
||||
// style={{ '--text-align': 'right' }}
|
||||
// placeholder={t("please input name")}
|
||||
// clearable
|
||||
// onChange={(value) => onChange('name', value)}
|
||||
// />
|
||||
// </Form.Item>
|
||||
// <Form.Item label={t("user:attr.idNumber")}>
|
||||
// <Input
|
||||
// value={idNumber}
|
||||
// style={{ '--text-align': 'right' }}
|
||||
// placeholder={t("please input idNumber")}
|
||||
// clearable
|
||||
// onChange={(value) => onChange('idNumber', value)}
|
||||
// />
|
||||
// </Form.Item>
|
||||
// </Form>
|
||||
// <div className={styles.buttonView}>
|
||||
// <Button block shape='rounded' color='primary' onClick={() => commit(fileList[0], fileList2[0])}>
|
||||
// {t("common::commit")}
|
||||
// </Button>
|
||||
// <SafeArea position='bottom' />
|
||||
// </div>
|
||||
// </div>
|
||||
// );
|
||||
const { t, update, onConfirm } = methods;
|
||||
const { oakFullpath, oakId, oakLegalActions, idState, name, idNumber, idCardType, idCardTypeArr, showBtn, } = data;
|
||||
const [open, setOpen] = useState(false);
|
||||
return (<div className={Styles.pageBody}>
|
||||
<div className={Styles.container}>
|
||||
<Form layout="horizontal">
|
||||
<Form.Item label={t('user:attr.name')} required>
|
||||
<Input disabled={idState !== 'unverified'} value={name} onChange={(val) => {
|
||||
update({
|
||||
name: val,
|
||||
});
|
||||
}} placeholder={t('please input name')}/>
|
||||
</Form.Item>
|
||||
<Form.Item label={t('user:attr.idCardType')} required>
|
||||
<div onClick={idState === 'unverified' ? () => {
|
||||
setOpen(true);
|
||||
} : undefined}>
|
||||
<Input value={idCardType
|
||||
? t('user:v.idCardType.' + idCardType)
|
||||
: ''} readOnly placeholder={t('please choose idCardType')}/>
|
||||
</div>
|
||||
|
||||
<Picker columns={[idCardTypeArr]} visible={open} onClose={() => {
|
||||
setOpen(false);
|
||||
}} value={idCardType ? [idCardType] : undefined} onConfirm={(v) => {
|
||||
update({
|
||||
idCardType: v[0],
|
||||
});
|
||||
}}/>
|
||||
</Form.Item>
|
||||
<Form.Item label={t('user:attr.idNumber')} required>
|
||||
<Input value={idNumber} disabled={!idCardType || idState !== 'unverified'} onChange={(val) => {
|
||||
update({
|
||||
idNumber: val,
|
||||
});
|
||||
}} placeholder={t('please input idNumber')}/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</div>
|
||||
|
||||
{showBtn ? (<Button block color="primary" size="large" onClick={() => {
|
||||
onConfirm();
|
||||
}}>
|
||||
提交认证
|
||||
</Button>) : null}
|
||||
</div>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ declare const _default: (props: import("oak-frontend-base").ReactComponentProps<
|
|||
entity: keyof EntityDict;
|
||||
entityFilter: any;
|
||||
relationIds: string[];
|
||||
rule: "single" | "all" | "free";
|
||||
ruleOnRow: "single" | "all" | "free";
|
||||
rule: "all" | "single" | "free";
|
||||
ruleOnRow: "all" | "single" | "free";
|
||||
onPickRelations: (ids: string[]) => void;
|
||||
onPickRows: (ids: string[]) => void;
|
||||
pickedRowIds: string[] | undefined;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ declare const _default: (props: import("oak-frontend-base").ReactComponentProps<
|
|||
claimUrl: string;
|
||||
qrCodeType: QrCodeType;
|
||||
multiple: boolean;
|
||||
rule: "single" | "all" | "free";
|
||||
ruleOnRow: "single" | "all" | "free";
|
||||
rule: "all" | "single" | "free";
|
||||
ruleOnRow: "all" | "single" | "free";
|
||||
}>) => React.ReactElement;
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
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;
|
||||
}>) => React.ReactElement;
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../oak-app-domain").EntityDict, keyof import("../../oak-app-domain").EntityDict, true, {
|
||||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../oak-app-domain").EntityDict, keyof import("../../oak-app-domain").EntityDict, false, {
|
||||
applicationId: string;
|
||||
isPlatform: boolean;
|
||||
tabKey: string;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
export default OakComponent({
|
||||
isList: true,
|
||||
isList: false,
|
||||
properties: {
|
||||
applicationId: '',
|
||||
isPlatform: false,
|
||||
|
|
@ -8,7 +8,6 @@ export default OakComponent({
|
|||
lifetimes: {
|
||||
async ready() {
|
||||
const { applicationId } = this.props;
|
||||
// const result = await this.features.wechatMenu.getCurrentMenu({ applicationId: applicationId! });
|
||||
const { data: wechatMenu } = await this.features.cache.refresh('wechatMenu', {
|
||||
data: {
|
||||
id: 1,
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ export default OakComponent({
|
|||
return {
|
||||
id: rows?.[0]?.id,
|
||||
config: rows?.[0]?.menuConfig,
|
||||
totalConfig: rows?.[0]?.menuConfig,
|
||||
iState: rows?.[0]?.iState,
|
||||
};
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,13 +1,10 @@
|
|||
import React from 'react';
|
||||
import { WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from "../../../oak-app-domain";
|
||||
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', true, {
|
||||
id: string;
|
||||
config: any;
|
||||
totalConfig: any;
|
||||
file: File;
|
||||
wechatInstance: WechatPublicInstance;
|
||||
errorIndex: number[];
|
||||
oakId: string;
|
||||
menuType: string;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import ActionPhone from '../actionPhone';
|
|||
import MenuInfo from '../menuInfo';
|
||||
export default function Render(props) {
|
||||
const { data, methods } = props;
|
||||
const { id, oakFullpath, config, wechatInstance, totalConfig, menuType, applicationId, actions, iState, tabKey } = data;
|
||||
const { id, oakFullpath, config, menuType, applicationId, actions, iState, tabKey } = data;
|
||||
const { updateItem, execute, create, } = methods;
|
||||
const [open, setOpen] = useState(false);
|
||||
const [isPreview, setIsPreview] = useState(false);
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import React from 'react';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from '../../oak-app-domain';
|
||||
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', true, {
|
||||
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', false, {
|
||||
is_menu_open: boolean;
|
||||
applicationId: string;
|
||||
menuId: string;
|
||||
isPlatform: boolean;
|
||||
tabKey: string;
|
||||
}, {}>): React.JSX.Element | null;
|
||||
}, {}>): React.JSX.Element;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import Style from './web.module.less';
|
|||
import { Tabs } from 'antd';
|
||||
import TagList from './tagList';
|
||||
export default function Render(props) {
|
||||
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey } = props.data;
|
||||
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey, } = props.data;
|
||||
const {} = props.methods;
|
||||
const [menuType, setMenuType] = useState('common');
|
||||
const [tag, setTag] = useState({});
|
||||
|
|
@ -16,38 +16,29 @@ export default function Render(props) {
|
|||
{
|
||||
key: '1',
|
||||
label: '通用菜单',
|
||||
children: <WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>,
|
||||
children: (<WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>),
|
||||
},
|
||||
{
|
||||
key: '2',
|
||||
label: '个性化菜单',
|
||||
children: <div className={Style.conditionalMenu}>
|
||||
children: (<div className={Style.conditionalMenu}>
|
||||
<div className={Style.tagList}>
|
||||
<TagList oakAutoUnmount={true} oakPath='$wechatPublicTag' applicationId={applicationId} getTag={getTag}/>
|
||||
<TagList oakAutoUnmount={true} oakPath="$wechatPublicTag" applicationId={applicationId} getTag={getTag}/>
|
||||
</div>
|
||||
{tag.id ? (<ConditionalMenu oakPath={`$conditionalMenu-${tag.id}`} applicationId={applicationId} oakAutoUnmount={true} tagId={tag.id} wechatId={tag.wechatId} menuType={menuType} tabKey={tabKey}/>) : (<div className={Style.tagHelp}>请选择一个标签</div>)}
|
||||
</div>,
|
||||
</div>),
|
||||
},
|
||||
];
|
||||
if (oakFullpath) {
|
||||
return (<div>
|
||||
{is_menu_open && (<div className={Style.tabs}>
|
||||
{isPlatform ? <WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/> : <Tabs defaultActiveKey='1' items={items} onChange={(key) => {
|
||||
if (key === '1') {
|
||||
setMenuType('common');
|
||||
}
|
||||
else {
|
||||
setMenuType('conditional');
|
||||
}
|
||||
}}/>}
|
||||
</div>)
|
||||
// : (
|
||||
// <div className={Style.container}>
|
||||
// <div className={Style.warn}>尚未开启菜单,请先前往微信公众平台开启。</div>
|
||||
// </div>
|
||||
// )
|
||||
}
|
||||
</div>);
|
||||
}
|
||||
return null;
|
||||
return (<div>
|
||||
{is_menu_open ? (<div className={Style.tabs}>
|
||||
{isPlatform ? (<WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>) : (<Tabs defaultActiveKey="1" items={items} onChange={(key) => {
|
||||
if (key === '1') {
|
||||
setMenuType('common');
|
||||
}
|
||||
else {
|
||||
setMenuType('conditional');
|
||||
}
|
||||
}}/>)}
|
||||
</div>) : null}
|
||||
</div>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -5,8 +5,7 @@ const tslib_1 = require("tslib");
|
|||
const WechatSDK_1 = tslib_1.__importDefault(require("oak-external-sdk/lib/WechatSDK"));
|
||||
const assert_1 = require("oak-domain/lib/utils/assert");
|
||||
const uuid_1 = require("oak-domain/lib/utils/uuid");
|
||||
const Exception_1 = require('oak-domain/lib/types/Exception');
|
||||
|
||||
const Exception_1 = require("oak-domain/lib/types/Exception");
|
||||
async function getWechatPublicConfig(applicationId, context) {
|
||||
const [application] = await context.select('application', {
|
||||
data: {
|
||||
|
|
@ -56,16 +55,14 @@ async function getMenu(params, context) {
|
|||
return result;
|
||||
}
|
||||
catch (e) {
|
||||
if (
|
||||
e instanceof Exception_1.OakExternalException &&
|
||||
e?.message?.includes('menu no exist')
|
||||
) {
|
||||
return {
|
||||
menu: {
|
||||
button: [],
|
||||
},
|
||||
};
|
||||
}
|
||||
if (e instanceof Exception_1.OakExternalException &&
|
||||
e?.message?.includes('menu no exist')) {
|
||||
return {
|
||||
menu: {
|
||||
button: []
|
||||
}
|
||||
};
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default checkers;
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -1,22 +1,15 @@
|
|||
|
||||
|
||||
.loginbox-main {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
background: var(--oak-bg-color-container);
|
||||
padding-top: 20%;
|
||||
}
|
||||
|
||||
.loginbox-wrap {
|
||||
width: 90%;
|
||||
display: block;
|
||||
background: var(--oak-bg-color-container);
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 4px rgb(0 0 0 / 8%), 0 0 4px rgb(0 0 0 / 8%);
|
||||
}
|
||||
|
||||
.loginbox-hd {
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ export default OakComponent({
|
|||
properties: {
|
||||
onFinish: undefined as (() => void) | undefined,
|
||||
bindNum: 10,
|
||||
addMobile: undefined as (() => void) | undefined,
|
||||
},
|
||||
methods: {
|
||||
async onRefreshMobile(e: WechatMiniprogram.Touch) {
|
||||
|
|
@ -84,9 +85,11 @@ export default OakComponent({
|
|||
},
|
||||
|
||||
goAddMobile() {
|
||||
this.navigateTo({
|
||||
url: '/mobile/login',
|
||||
});
|
||||
const { addMobile } = this.props;
|
||||
if (addMobile) {
|
||||
addMobile();
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
async onRemoveConfirm() {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
import React, { useState } from 'react';
|
||||
import { List, Button, Modal, Dialog } from 'antd-mobile';
|
||||
import { List, Button, Popup, Dialog } from 'antd-mobile';
|
||||
import { MobileOutlined, DeleteOutlined } from '@ant-design/icons';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from '../../../oak-app-domain';
|
||||
import Style from './mobile.module.less';
|
||||
|
||||
import MobileLogin from '../login';
|
||||
|
||||
export default function render(
|
||||
props: WebComponentProps<
|
||||
EntityDict,
|
||||
|
|
@ -22,6 +24,8 @@ export default function render(
|
|||
) {
|
||||
const { mobiles, allowRemove, tokenMobileId } = props.data;
|
||||
const { goAddMobile, removeItem, recoverItem, execute } = props.methods;
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<div className={Style.container}>
|
||||
{mobiles && mobiles.length > 0 ? (
|
||||
|
|
@ -32,7 +36,8 @@ export default function render(
|
|||
key={index}
|
||||
prefix={<MobileOutlined />}
|
||||
extra={
|
||||
allowRemove && tokenMobileId !== ele.id && (
|
||||
allowRemove &&
|
||||
tokenMobileId !== ele.id && (
|
||||
<div
|
||||
onClick={async () => {
|
||||
const result =
|
||||
|
|
@ -44,8 +49,7 @@ export default function render(
|
|||
removeItem(ele.id);
|
||||
try {
|
||||
await execute();
|
||||
}
|
||||
catch (err) {
|
||||
} catch (err) {
|
||||
recoverItem(ele.id);
|
||||
throw err;
|
||||
}
|
||||
|
|
@ -73,10 +77,31 @@ export default function render(
|
|||
block
|
||||
size="large"
|
||||
color="primary"
|
||||
onClick={() => goAddMobile()}
|
||||
onClick={() => setOpen(true)}
|
||||
>
|
||||
绑定
|
||||
</Button>
|
||||
|
||||
<Popup
|
||||
visible={open}
|
||||
showCloseButton={true}
|
||||
onClose={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
bodyStyle={{
|
||||
borderTopLeftRadius: '8px',
|
||||
borderTopRightRadius: '8px',
|
||||
height: '40vh',
|
||||
}}
|
||||
>
|
||||
<MobileLogin
|
||||
callback={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
oakPath="$mobile/me-mobile/login"
|
||||
oakAutoUnmount={true}
|
||||
/>
|
||||
</Popup>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,54 +1,16 @@
|
|||
.addView {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
left: 50%;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.imgView {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.img {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
.pageBody {
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.imgContent {
|
||||
padding: 16px;
|
||||
margin: 16px;
|
||||
border-radius: 8px;
|
||||
background-color: var(--oak-bg-color-page);
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: #fff;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.circleBtn {
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--oak-color-primary);
|
||||
}
|
||||
|
||||
.buttonView {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
justify-content: flex-end;
|
||||
padding: 16px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
|
@ -1,10 +1,8 @@
|
|||
import React, { useRef, useState } from 'react';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from '../../../oak-app-domain';
|
||||
import styles from './mobile.module.less';
|
||||
import { Image, Card, Space, Form, Input, SafeArea, Button, Result } from 'antd-mobile';
|
||||
import { AddOutline } from 'antd-mobile-icons';
|
||||
import type { UploadFile, UploadProps } from 'antd/es/upload/interface';
|
||||
import Styles from './mobile.module.less';
|
||||
import { Picker, Form, Input, Button } from 'antd-mobile';
|
||||
|
||||
export default function Render(
|
||||
props: WebComponentProps<
|
||||
|
|
@ -16,117 +14,105 @@ export default function Render(
|
|||
name: string;
|
||||
idNumber: string;
|
||||
idState: EntityDict['user']['Schema']['idState'];
|
||||
idCardType: EntityDict['user']['Schema']['idCardType'];
|
||||
idCardTypeArr: { value: string; label: string }[];
|
||||
showBtn: boolean;
|
||||
},
|
||||
{
|
||||
commit: (file1: UploadFile, file2: UploadFile) => void;
|
||||
prevImg: (file: UploadFile, id: string) => void;
|
||||
onChange: (attr: keyof EntityDict['user']['Schema'], value: string) => void;
|
||||
onConfirm: () => void;
|
||||
}
|
||||
>
|
||||
) {
|
||||
const { methods, data } = props;
|
||||
const { t, onChange, prevImg, commit } = methods;
|
||||
// const { oakFullpath, oakId, oakLegalActions, userId, idState, name, idNumber } = data;
|
||||
// const [fileList, setFileList] = useState<UploadFile[]>([]);
|
||||
// const [fileList2, setFileList2] = useState<UploadFile[]>([]);
|
||||
// const uploadProps: UploadProps = {
|
||||
// maxCount: 1,
|
||||
// showUploadList: false,
|
||||
// beforeUpload: (file) => {
|
||||
// return false;
|
||||
// },
|
||||
// onChange: ({ file, fileList, event }) => {
|
||||
// prevImg(file, 'imgView1');
|
||||
// setFileList([...fileList]);
|
||||
// },
|
||||
// fileList,
|
||||
// };
|
||||
const { t, update, onConfirm } = methods;
|
||||
const {
|
||||
oakFullpath,
|
||||
oakId,
|
||||
oakLegalActions,
|
||||
idState,
|
||||
name,
|
||||
idNumber,
|
||||
idCardType,
|
||||
idCardTypeArr,
|
||||
showBtn,
|
||||
} = data;
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
// const uploadProps2: UploadProps = {
|
||||
// maxCount: 1,
|
||||
// showUploadList: false,
|
||||
// beforeUpload: (file) => {
|
||||
// return false;
|
||||
// },
|
||||
// onChange: ({ file, fileList, event }) => {
|
||||
// prevImg(file, 'imgView2');
|
||||
// setFileList2([...fileList]);
|
||||
// },
|
||||
// fileList: fileList2,
|
||||
// };
|
||||
// if (idState === 'verified') {
|
||||
// return (
|
||||
// <Result
|
||||
// status='success'
|
||||
// title={t("Real name verification passed")}
|
||||
// />
|
||||
// )
|
||||
// }
|
||||
return (
|
||||
<div className={Styles.pageBody}>
|
||||
<div className={Styles.container}>
|
||||
<Form layout="horizontal">
|
||||
<Form.Item label={t('user:attr.name')} required>
|
||||
<Input
|
||||
disabled={idState !== 'unverified'}
|
||||
value={name}
|
||||
onChange={(val) => {
|
||||
update({
|
||||
name: val,
|
||||
});
|
||||
}}
|
||||
placeholder={t('please input name')}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label={t('user:attr.idCardType')} required>
|
||||
<div
|
||||
onClick={idState === 'unverified' ? () => {
|
||||
setOpen(true);
|
||||
} : undefined}
|
||||
>
|
||||
<Input
|
||||
value={
|
||||
idCardType
|
||||
? t('user:v.idCardType.' + idCardType)
|
||||
: ''
|
||||
}
|
||||
readOnly
|
||||
placeholder={t('please choose idCardType')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
return null;
|
||||
<Picker
|
||||
columns={[idCardTypeArr]}
|
||||
visible={open}
|
||||
onClose={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
value={idCardType ? [idCardType] : undefined}
|
||||
onConfirm={(v) => {
|
||||
update({
|
||||
idCardType:
|
||||
v[0] as EntityDict['user']['Schema']['idCardType'],
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label={t('user:attr.idNumber')} required>
|
||||
<Input
|
||||
value={idNumber}
|
||||
disabled={!idCardType || idState !== 'unverified'}
|
||||
onChange={(val) => {
|
||||
update({
|
||||
idNumber: val,
|
||||
});
|
||||
}}
|
||||
placeholder={t('please input idNumber')}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</div>
|
||||
|
||||
// return (
|
||||
// <div className={styles.container}>
|
||||
// <div className={styles.imgContent}>
|
||||
// <Upload {...uploadProps}>
|
||||
// <div id="imgView1" className={styles.imgView} style={{ marginBottom: 16 }}>
|
||||
// <IDCard1 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
|
||||
// {/* <img id="img1" className={styles.img} /> */}
|
||||
// {fileList.length === 0 && (
|
||||
// <Space direction="vertical" className={styles.addView} align="center">
|
||||
// <div className={styles.circleBtn}>
|
||||
// <AddOutline color="#fff" />
|
||||
// </div>
|
||||
// <div className={styles.text}>
|
||||
// {t("Identity witness profile")}
|
||||
// </div>
|
||||
// </Space>
|
||||
// )}
|
||||
// </div>
|
||||
// </Upload>
|
||||
// <Upload {...uploadProps2}>
|
||||
// <div id="imgView2" className={styles.imgView}>
|
||||
// <IDCard2 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
|
||||
// {/* <img id="img2" className={styles.img} /> */}
|
||||
// {fileList2.length === 0 && (
|
||||
// <Space direction="vertical" className={styles.addView} align="center">
|
||||
// <div className={styles.circleBtn}>
|
||||
// <AddOutline color="#fff" />
|
||||
// </div>
|
||||
// <div className={styles.text}>
|
||||
// {t("Identity national emblem profile")}
|
||||
// </div>
|
||||
// </Space>
|
||||
// )}
|
||||
// </div>
|
||||
// </Upload>
|
||||
// </div>
|
||||
// <Form layout='horizontal'>
|
||||
// <Form.Item label={t("user:attr.name")}>
|
||||
// <Input
|
||||
// value={name}
|
||||
// style={{ '--text-align': 'right' }}
|
||||
// placeholder={t("please input name")}
|
||||
// clearable
|
||||
// onChange={(value) => onChange('name', value)}
|
||||
// />
|
||||
// </Form.Item>
|
||||
// <Form.Item label={t("user:attr.idNumber")}>
|
||||
// <Input
|
||||
// value={idNumber}
|
||||
// style={{ '--text-align': 'right' }}
|
||||
// placeholder={t("please input idNumber")}
|
||||
// clearable
|
||||
// onChange={(value) => onChange('idNumber', value)}
|
||||
// />
|
||||
// </Form.Item>
|
||||
// </Form>
|
||||
// <div className={styles.buttonView}>
|
||||
// <Button block shape='rounded' color='primary' onClick={() => commit(fileList[0], fileList2[0])}>
|
||||
// {t("common::commit")}
|
||||
// </Button>
|
||||
// <SafeArea position='bottom' />
|
||||
// </div>
|
||||
// </div>
|
||||
// );
|
||||
{showBtn ? (
|
||||
<Button
|
||||
block
|
||||
color="primary"
|
||||
size="large"
|
||||
onClick={() => {
|
||||
onConfirm();
|
||||
}}
|
||||
>
|
||||
提交认证
|
||||
</Button>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
export default OakComponent({
|
||||
isList: true,
|
||||
isList: false,
|
||||
properties: {
|
||||
applicationId: '',
|
||||
isPlatform: false,
|
||||
|
|
@ -9,7 +9,6 @@ export default OakComponent({
|
|||
lifetimes: {
|
||||
async ready() {
|
||||
const { applicationId } = this.props;
|
||||
// const result = await this.features.wechatMenu.getCurrentMenu({ applicationId: applicationId! });
|
||||
const { data: wechatMenu } = await this.features.cache.refresh(
|
||||
'wechatMenu',
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
import WechatSDK, { WechatMpInstance, WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
|
||||
import { WechatMpConfig, WechatPublicConfig } from '../../../oak-app-domain/Application/Schema';
|
||||
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
|
||||
|
||||
export default OakComponent({
|
||||
isList: true,
|
||||
entity: 'wechatMenu',
|
||||
|
|
@ -22,7 +20,6 @@ export default OakComponent({
|
|||
return {
|
||||
id: rows?.[0]?.id,
|
||||
config: rows?.[0]?.menuConfig,
|
||||
totalConfig: rows?.[0]?.menuConfig,
|
||||
iState: rows?.[0]?.iState,
|
||||
};
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
|
||||
import { WebComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict } from "../../../oak-app-domain";
|
||||
import Style from './web.module.less';
|
||||
import { Space, Button, Form, Input, Radio, Modal } from 'antd';
|
||||
import { Modal } from 'antd';
|
||||
import Preview from '../preview';
|
||||
import ActionPhone from '../actionPhone';
|
||||
import MenuInfo from '../menuInfo';
|
||||
|
||||
export default function Render(
|
||||
props: WebComponentProps<
|
||||
EntityDict,
|
||||
|
|
@ -15,9 +15,7 @@ export default function Render(
|
|||
{
|
||||
id: string;
|
||||
config: any;
|
||||
totalConfig: any;
|
||||
file: File;
|
||||
wechatInstance: WechatPublicInstance;
|
||||
errorIndex: number[];
|
||||
oakId: string;
|
||||
menuType: string;
|
||||
|
|
@ -32,7 +30,7 @@ export default function Render(
|
|||
>
|
||||
) {
|
||||
const { data, methods } = props;
|
||||
const { id, oakFullpath, config, wechatInstance, totalConfig, menuType, applicationId, actions, iState, tabKey } = data;
|
||||
const { id, oakFullpath, config, menuType, applicationId, actions, iState, tabKey } = data;
|
||||
const {
|
||||
updateItem,
|
||||
execute,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export default function Render(
|
|||
props: WebComponentProps<
|
||||
EntityDict,
|
||||
'wechatMenu',
|
||||
true,
|
||||
false,
|
||||
{
|
||||
is_menu_open: boolean;
|
||||
applicationId: string;
|
||||
|
|
@ -20,100 +20,101 @@ export default function Render(
|
|||
isPlatform: boolean;
|
||||
tabKey: string;
|
||||
},
|
||||
{
|
||||
}
|
||||
{}
|
||||
>
|
||||
) {
|
||||
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey } = props.data;
|
||||
const { } = props.methods;
|
||||
const {
|
||||
menuId,
|
||||
oakFullpath,
|
||||
is_menu_open,
|
||||
applicationId,
|
||||
isPlatform,
|
||||
tabKey,
|
||||
} = props.data;
|
||||
const {} = props.methods;
|
||||
const [menuType, setMenuType] = useState('common');
|
||||
const [tag, setTag] = useState({} as { id: string, name: string, wechatId: string });
|
||||
const [tag, setTag] = useState(
|
||||
{} as { id: string; name: string; wechatId: string }
|
||||
);
|
||||
|
||||
const getTag = (tag: { id: string, name: string, wechatId: string }) => {
|
||||
const getTag = (tag: { id: string; name: string; wechatId: string }) => {
|
||||
setTag(tag);
|
||||
}
|
||||
};
|
||||
|
||||
const items: TabsProps['items'] = [
|
||||
{
|
||||
key: '1',
|
||||
label: '通用菜单',
|
||||
children: <WechatMenu
|
||||
menuId={menuId ? menuId : undefined}
|
||||
oakPath={'$wechatMenu'}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/>,
|
||||
children: (
|
||||
<WechatMenu
|
||||
menuId={menuId ? menuId : undefined}
|
||||
oakPath={'$wechatMenu'}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
key: '2',
|
||||
label: '个性化菜单',
|
||||
children:
|
||||
children: (
|
||||
<div className={Style.conditionalMenu}>
|
||||
<div className={Style.tagList}>
|
||||
<TagList
|
||||
oakAutoUnmount={true}
|
||||
oakPath='$wechatPublicTag'
|
||||
oakPath="$wechatPublicTag"
|
||||
applicationId={applicationId}
|
||||
getTag={getTag}
|
||||
/>
|
||||
</div>
|
||||
{
|
||||
tag.id ? (
|
||||
<ConditionalMenu
|
||||
oakPath={`$conditionalMenu-${tag.id}`}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
tagId={tag.id}
|
||||
wechatId={tag.wechatId}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/>
|
||||
) : (
|
||||
<div className={Style.tagHelp}>请选择一个标签</div>
|
||||
)
|
||||
}
|
||||
</div>,
|
||||
{tag.id ? (
|
||||
<ConditionalMenu
|
||||
oakPath={`$conditionalMenu-${tag.id}`}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
tagId={tag.id}
|
||||
wechatId={tag.wechatId}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/>
|
||||
) : (
|
||||
<div className={Style.tagHelp}>请选择一个标签</div>
|
||||
)}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
if (oakFullpath) {
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
is_menu_open && (
|
||||
<div className={Style.tabs}>
|
||||
{
|
||||
isPlatform ? <WechatMenu
|
||||
menuId={menuId ? menuId : undefined}
|
||||
oakPath={'$wechatMenu'}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/> : <Tabs
|
||||
defaultActiveKey='1'
|
||||
items={items}
|
||||
onChange={(key: string) => {
|
||||
if (key === '1') {
|
||||
setMenuType('common');
|
||||
} else {
|
||||
setMenuType('conditional');
|
||||
}
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
// : (
|
||||
// <div className={Style.container}>
|
||||
// <div className={Style.warn}>尚未开启菜单,请先前往微信公众平台开启。</div>
|
||||
// </div>
|
||||
// )
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
return null;
|
||||
return (
|
||||
<div>
|
||||
{is_menu_open ? (
|
||||
<div className={Style.tabs}>
|
||||
{isPlatform ? (
|
||||
<WechatMenu
|
||||
menuId={menuId ? menuId : undefined}
|
||||
oakPath={'$wechatMenu'}
|
||||
applicationId={applicationId}
|
||||
oakAutoUnmount={true}
|
||||
menuType={menuType}
|
||||
tabKey={tabKey}
|
||||
/>
|
||||
) : (
|
||||
<Tabs
|
||||
defaultActiveKey="1"
|
||||
items={items}
|
||||
onChange={(key: string) => {
|
||||
if (key === '1') {
|
||||
setMenuType('common');
|
||||
} else {
|
||||
setMenuType('conditional');
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Loading…
Reference in New Issue