From f16b217b6e83689e8f73be8b3927b52d88ab853d Mon Sep 17 00:00:00 2001 From: guanpengchn <875499765@qq.com> Date: Sun, 16 Jun 2019 15:57:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=9D=E5=AD=98=E5=92=8C=E5=AF=BC?= =?UTF-8?q?=E5=85=A5)=20=E6=96=B0=E5=A2=9E=E4=BF=9D=E5=AD=98=E5=88=B0?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=92=8C=E4=BB=8E=E6=9C=AC=E5=9C=B0=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 17 --- id_rsa.enc | Bin 1680 -> 0 bytes src/App.js | 8 ++ src/components/Button/Export.js | 165 +++++++++++++++++++++++++++ src/components/Dialog/DialogHelp.js | 8 +- src/components/Navbar/ListStorage.js | 33 +++--- src/utils/constant.js | 6 +- src/utils/helper.js | 14 +++ 8 files changed, 213 insertions(+), 38 deletions(-) delete mode 100644 .travis.yml delete mode 100644 id_rsa.enc create mode 100644 src/components/Button/Export.js diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 77a8d51..0000000 --- a/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: node_js -node_js: - - '10' -branchs: - only: - - master -install: - - yarn install -script: - - yarn build -addons: - ssh_known_hosts: 39.96.191.154 -before_install: - - openssl aes-256-cbc -K $encrypted_e6c41ade86ae_key -iv $encrypted_e6c41ade86ae_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d -after_success: - - chmod 600 ~/.ssh/id_rsa - - ssh travis@39.96.191.154 -o StrictHostKeyChecking=no 'cd ~/markdown-resume && git pull && yarn install && yarn build' \ No newline at end of file diff --git a/id_rsa.enc b/id_rsa.enc deleted file mode 100644 index 512703eaf83ef3f1c8761dbc53944a4a4afe39ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmV;B25k?!>^aPDoMG38HzYW+(Y?wx^YN{4P72=#OBOaB8J58#~ zxCnv85anp5U4fVML$&-@>aeS@km1;y3}^+}w{t6td_{-rc3 zGA36c-v0AhUNkl=r_GQW=ZhMjR8X;TwB`5VE`$P(o2Nt_?B{O>(75FOp+WNOncNhC zm9lu(PpISQH?~va92W{_aJG%?-G+3z7PHv106+XjF7KCY+~rdWKbzami<~5K=!~)B z|L&L#M0rI>0KZWpJ%_Tw!Wi=(Al4wtw~QkTpiP+_OYgU9$4+;0mLO`PGmL7`rEp3f znw4UIRulDbNk&*U!_i{@oo3JOkL3)V)tfR>yi$H34t!3J=JkNCMt5<4vAW3DV%my8 zp{XNtj(${Ju!N;Y#gugfk7=iKk}TOHv9btAR*#^@;r&s@LWRig9TUpUGEu%_VMOPC zfHTn@S&?2NFKILMA;Gz8NOST7A^$ z~ruezB!M z!!t?>lofYH)jp`%_haX7mnrD2G*n#?mZ`TZ0>wTuhru+DLP2HGqFeR>pfV!EWWt(Z z@xovM@S__zaW*zbCs9mYF9Blrq??;!Hslj9pT6juRJq)Rlv}*l+DC9DEtO+jFFpMHy+6B=OuhLUse8Jn#%@G{{^d%g_3Vb#9uju=I3eXFU{sIoPOW1|WaAKm&-4SFxweqtoNK@Hf(nLI} zWkQd{)EE4w|91o5fIIkQ@AA|P_b_67908QwU_{rQI)$f;icz2 z$=IlkVJMugIO9E9@D!Qlbcuo!RnzVD@`SGKJP0jobk>Ys4-)5^BEOp1&D_E*q+c>+ z#k|8mzK0TNVp`r>R4EDRM9s{~LUxjb*0zW);ry$zMXFyf%&)zgmeVsCSqX&Gbu*P|C4{t@Bqn36;05;XSw z5hi%^-GR{G=GN0gb*3RqI5&)P=?k@Kb@*PVRWz9q4KVN<$nv22U8W&0(HGYi!Na+$ z9X?YaKb29G($NT`Ib)VD?c#C)#gx{_L&+5yfEM-~yY@S#h#Zg4KGC3+cgl03723>( zy}0QtweFx&n=v*vZwX=(!+vwkPeWJu+wzMGHMR_&VStq?1Dfh<82i?A9PIIhkZU*# z+}?M!Gt3z#bHafrL$GK9-4)A9R^I6smE0AmobFKLBMjclaU8V;CDwzBlx~%}Yo6)I z{Y`Vfv^F8yA*7fU$+C7{2K$y0{CG>F^i)$+fbY?e%#I7hZ8BJ-Eh5nfOp$u&TiG?2 zl*^GiqS}Ro=KPinCT2XdYqezYYA&M1#ytK}=5{~HbQz+JgK=1_%WA4%QoC ar^DZBI!@i4PZ|cE`2@SF@0X$obtF1CS4NWn diff --git a/src/App.js b/src/App.js index bc288d3..60af774 100755 --- a/src/App.js +++ b/src/App.js @@ -34,6 +34,14 @@ class App extends Component { this.props.navbar.setBtnDisable(true); } }; + + window.onbeforeunload = e => { + e = e || window.event; + if (e) { + e.returnValue = "数据目前存储在浏览器中,记得保存到本地备份!"; + } + return "数据目前存储在浏览器中,记得保存到本地备份!"; + }; } componentDidUpdate() { diff --git a/src/components/Button/Export.js b/src/components/Button/Export.js new file mode 100644 index 0000000..9aed65c --- /dev/null +++ b/src/components/Button/Export.js @@ -0,0 +1,165 @@ +import React, { Component } from "react"; + +import PropTypes from "prop-types"; +import { withStyles } from "@material-ui/core/styles"; + +import Menu from "@material-ui/core/Menu"; +import Button from "@material-ui/core/Button"; +import MenuItem from "@material-ui/core/MenuItem"; +import Tooltip from "@material-ui/core/Tooltip"; + +import corner from "../../icons/corner.svg"; + +import { ENTER_DELAY, LEAVE_DELAY, STORAGE_LAYOUT } from "../../utils/constant"; +import { downloadFile } from "../../utils/helper"; + +import { observer, inject } from "mobx-react"; + +@inject("navbar") +@inject("dialog") +@observer +class Export extends Component { + state = { + exportAnchorEl: null + }; + + openModeMenu = event => { + event.stopPropagation(); + this.setState({ exportAnchorEl: event.currentTarget }); + }; + + closeModeMenu = event => { + event.stopPropagation(); + this.setState({ exportAnchorEl: null }); + }; + + handleExport = event => { + event.stopPropagation(); + this.props.navbar.setExported(true); + this.setState({ exportAnchorEl: null }); + }; + + saveToLocal = event => { + event.stopPropagation(); + const layout = window.localStorage.getItem(STORAGE_LAYOUT); + const filename = `markdown-resume-${new Date().getTime()}.json`; + downloadFile(filename, layout); + this.setState({ exportAnchorEl: null }); + }; + + importFromLocal = event => { + event.stopPropagation(); + const file = event.target.files[0]; + this.fileReader = new FileReader(); + this.fileReader.onloadend = this.handleFileRead; + this.fileReader.readAsText(file); + this.setState({ exportAnchorEl: null }); + }; + + handleFileRead = e => { + const content = this.fileReader.result; + window.localStorage.setItem(STORAGE_LAYOUT, content); + window.location.href = "/"; + }; + + openHelpDialog = event => { + event.stopPropagation(); + this.props.dialog.setHelpOpened(true); + this.setState({ exportAnchorEl: null }); + }; + + render() { + const { classes } = this.props; + + const { exportAnchorEl } = this.state; + const exportOpen = Boolean(exportAnchorEl); + + return ( +
+ + + + + {/* 模板选择器菜单 */} + + + + 导出PDF + + + 保存到本地 + + + + 帮助 + + +
+ ); + } +} + +const styles = theme => ({ + btn: { + padding: "0px 10px", + height: "100%", + width: "100px" + }, + menu: { + top: "40px !important" + }, + menuItem: { + fontSize: "0.95em" + }, + corner: { + position: "absolute", + bottom: 2, + right: 2 + }, + input: { + display: "none" + }, + label: { + width: "100%", + height: "100%" + } +}); + +Export.propTypes = { + classes: PropTypes.object.isRequired +}; + +export default withStyles(styles)(Export); diff --git a/src/components/Dialog/DialogHelp.js b/src/components/Dialog/DialogHelp.js index ac23a14..a4f8421 100644 --- a/src/components/Dialog/DialogHelp.js +++ b/src/components/Dialog/DialogHelp.js @@ -61,9 +61,9 @@ class DialogHelp extends Component { indicatorColor="primary" textColor="primary" > + - {value === 0 && ( )} - {value === 2 &&

Item Three

} + {value === 2 && ( + + )} - + */} + {/* */} - logo - + */} ); } diff --git a/src/utils/constant.js b/src/utils/constant.js index ff46f61..7b4a575 100644 --- a/src/utils/constant.js +++ b/src/utils/constant.js @@ -77,6 +77,10 @@ export const HELP_MARKDOWN = ` \`\`\` `; -export const HELP_INFO = [HELP_USE, HELP_MARKDOWN]; +export const HELP_NOTICE = ` +### 简历数据目前自动保存在浏览器中,如果清理浏览器将会丢失! +### 记得编辑后保存到本地备份! +` +export const HELP_INFO = [HELP_NOTICE, HELP_USE, HELP_MARKDOWN]; export const THEMES = [THEME0, THEME1, THEME2, THEME3, THEME4]; diff --git a/src/utils/helper.js b/src/utils/helper.js index af1b672..7b27dfd 100644 --- a/src/utils/helper.js +++ b/src/utils/helper.js @@ -224,3 +224,17 @@ const solveLine = value => { } return html; }; + +/** + * 创建并下载文件 + * @param {String} fileName 文件名 + * @param {String} content 文件内容 + */ +export const downloadFile = (fileName, content) => { + var aTag = document.createElement('a'); + var blob = new Blob([content]); + aTag.download = fileName; + aTag.href = URL.createObjectURL(blob); + aTag.click(); + URL.revokeObjectURL(blob); +} \ No newline at end of file