🆕 新增模版库功能, 但需要配合独立server端调用模版数据

This commit is contained in:
xujiang 2020-10-12 01:27:50 +08:00
parent 1c39627e94
commit 937a0d9bf3
6 changed files with 14822 additions and 15041 deletions

View File

@ -62,6 +62,7 @@
"axios": "^0.19.2",
"chatbot-antd": "^0.6.0",
"codemirror": "^5.57.0",
"dom-to-image": "^2.6.0",
"file-saver": "^2.0.2",
"http-server": "^0.12.3",
"qrcode.react": "^1.0.0",

View File

@ -40,6 +40,11 @@
text-align: right;
}
}
.saveForm {
.formIpt {
margin-bottom: 20px;
}
}
@media screen and (min-width: 1280px) {
.header {
.logoArea {

View File

@ -1,4 +1,4 @@
import React, { useRef, memo, useContext } from 'react';
import React, { useRef, memo, useContext, useState, useEffect } from 'react';
import { Button, Input, Popover, Modal, Select } from 'antd';
import {
ArrowLeftOutlined,
@ -34,6 +34,7 @@ interface HeaderComponentProps {
const HeaderComponent = memo((props: HeaderComponentProps) => {
const { pointData, location, clearData, undohandler, redohandler } = props;
const [showModalIframe, setShowModalIframe] = useState(false);
const iptRef = useRef<Input>(null);
const toPreview = () => {
@ -72,6 +73,20 @@ const HeaderComponent = memo((props: HeaderComponentProps) => {
<span></span>
<Input ref={iptRef} />
</div>
<div className={styles.formIpt}>
<span></span>
<Button
type="primary"
size="small"
style={{ marginRight: '20px' }}
onClick={() => generateFace(1)}
>
</Button>
<Button size="small" onClick={() => generateFace(0)}>
使
</Button>
</div>
<div className={styles.formIpt}>
<span>访</span>
<Input disabled value="暂未开放,保存之后可以在模版库中访问" />
@ -146,6 +161,14 @@ const HeaderComponent = memo((props: HeaderComponentProps) => {
},
});
};
useEffect(() => {
// 定义截图子页面句柄函数
window.getFaceUrl = url => {
setFaceUrl(url);
setShowModalIframe(false);
};
}, []);
const { setTheme } = useContext(dooringContext);
return (
<div className={styles.header}>
@ -248,6 +271,19 @@ const HeaderComponent = memo((props: HeaderComponentProps) => {
</Button>
</div>
<Modal
title="正在生成封面..."
visible={showModalIframe}
footer={null}
width={420}
closable={false}
destroyOnClose={true}
>
<iframe
src={`/h5_plus/preview?tid=${props.location.query.tid}&gf=1`}
style={{ width: '100%', border: 'none', height: '600px' }}
></iframe>
</Modal>
</div>
);
});

View File

@ -1,6 +1,7 @@
import React, { CSSProperties, memo, useEffect, useMemo, useRef, useState } from 'react';
import GridLayout from 'react-grid-layout';
import DynamicEngine from 'components/DynamicEngine';
import domtoimage from 'dom-to-image';
import req from '@/utils/req';
import styles from './index.less';
import { useGetScrollBarWidth } from '@/utils/tool';
@ -35,20 +36,29 @@ const PreviewPage = memo((props: PreviewPageProps) => {
const vw = window.innerWidth;
useEffect(() => {
const tid = props.location.query?.tid;
req
.get<any, PointDataItem[]>('/visible/preview/get', { params: { tid } })
.then(res => {
setPointData(
res.map(item => ({
...item,
point: { ...item.point, isDraggable: false, isResizable: false },
})),
);
})
.catch(err => {
console.error(err);
const { tid, gf } = props.location.query!;
if (!gf) {
req
.get<any, PointDataItem[]>('/visible/preview/get', { params: { tid } })
.then(res => {
setPointData(
res.map(item => ({
...item,
point: { ...item.point, isDraggable: false, isResizable: false },
})),
);
})
.catch(err => {
console.error(err);
});
return;
}
setTimeout(() => {
generateImg((url: string) => {
parent.window.getFaceUrl(url);
});
}, 3000);
}, [props.location.query]);
const ref = useRef<HTMLDivElement>(null);
@ -64,6 +74,21 @@ const PreviewPage = memo((props: PreviewPageProps) => {
};
}, [width]);
const generateImg = (cb: any) => {
domtoimage
.toBlob(ref.current)
.then(function(blob: Blob) {
const formData = new FormData();
formData.append('file', blob, 'tpl.jpg');
req.post('/files/xxx', formData).then((res: any) => {
cb && cb(res.url);
});
})
.catch(function(error: any) {
console.error('oops, something went wrong!', error);
});
};
return (
<>
<div ref={ref} style={vw > 800 ? pcStyle : {}}>

6
src/typings.d.ts vendored
View File

@ -4,3 +4,9 @@ declare module '*.less';
interface Window {
currentCates: null | Array<string>;
}
declare module 'dom-to-image' {
const domtoimage: any;
export default domtoimage;
}
declare var getFaceUrl: any;

29762
yarn.lock

File diff suppressed because it is too large Load Diff