├── README.md ├── config ├── env.js ├── jest │ ├── cssTransform.js │ └── fileTransform.js ├── paths.js ├── polyfills.js ├── webpack.config.dev.js ├── webpack.config.prod.js └── webpackDevServer.config.js ├── images ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png └── 6.png ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html └── manifest.json ├── scripts ├── build.js ├── start.js └── test.js ├── server ├── app.js ├── model │ └── model.js ├── routes │ ├── article.js │ ├── message.js │ ├── music.js │ └── user.js ├── upload │ ├── image-1519493311082.jpg │ ├── image-1520226979355.jpg │ ├── image-1520227864323.jpg │ ├── image-1520229547392.jpg │ ├── image-1520350000324.jpg │ ├── music-1520226984271.mp3 │ ├── music-1520227879326.mp3 │ └── music-1520229552446.mp3 └── views │ └── index.ejs └── src ├── Global.scss ├── actions └── actions.js ├── components ├── articleEditor │ ├── articleEditor.js │ └── articleEditor.scss ├── articlelist │ ├── articlelist.js │ └── articlelist.scss ├── articlepage │ ├── articlepage.js │ └── articlepage.scss ├── authRoute │ └── authRoute.js ├── categorylist │ ├── categoryList.scss │ └── categorylist.js ├── editArticleList │ ├── editArticleList.js │ └── editArticleList.scss ├── editMessageList │ ├── editMessageList.js │ └── editMessageList.scss ├── editMusicList │ ├── editMusicList.js │ └── editMusicList.scss ├── editUserPage │ ├── editUserPage.js │ └── editUserPage.scss ├── messagelist │ ├── messagelist.js │ └── messagelist.scss ├── messagepost │ ├── messagepost.js │ └── messagepost.scss ├── musicPlayer │ ├── musicPlayer.js │ └── musicPlayer.scss ├── navlist │ ├── navlist.js │ └── navlist.scss ├── uploadMusic │ ├── uploadMusic.js │ └── uploadMusic.scss └── userinfo │ ├── userinfo.js │ └── userinfo.scss ├── containers ├── admin │ ├── admin.js │ ├── admin.scss │ └── subpage │ │ ├── editArticle.js │ │ ├── editMessage.js │ │ ├── editMusic.js │ │ ├── editUser.js │ │ ├── postArticle.js │ │ └── updateArticle.js ├── blog │ ├── blog.js │ ├── blog.scss │ └── subpage │ │ ├── article.js │ │ └── blogindex.js ├── homepage │ ├── homepage.js │ └── homepage.scss ├── layout │ ├── layout.js │ └── layout.scss ├── message │ ├── message.js │ └── message.scss ├── music │ ├── music.js │ └── music.scss ├── register │ ├── register.js │ └── register.scss └── signin │ ├── signin.js │ └── signin.scss ├── index.js ├── logo.svg ├── reducers ├── article.js ├── message.js ├── music.js ├── reducers.js └── user.js ├── registerServiceWorker.js └── static ├── font ├── demo.css ├── demo_fontclass.html ├── demo_symbol.html ├── demo_unicode.html ├── iconfont.css ├── iconfont.eot ├── iconfont.js ├── iconfont.svg ├── iconfont.ttf └── iconfont.woff ├── images ├── avatar.jpg ├── blog-bg.png └── wrap-bg.png └── music └── 山丘.mp3 /README.md: -------------------------------------------------------------------------------- 1 | 一款前后端分离,单页面的个人博客 2 | ==== 3 | 所用技术栈 4 | ------ 5 | 前端用React技术栈,React + Redux + React-Router, 6 | 前端后台管理界面antd, 7 | CSS预处理器用了Sass, 8 | 前后端数据传输用axios库, 9 | 后端用Node,express框架,数据库MongoDB。 10 | 11 | 简述 12 | ------ 13 | 第一次从界面设计排版,到前后端编程,到部署上线都独立完成的一个项目(还在等域名备案。。。) 14 | 15 | 写这个博客,一是想给自己平常所学的东西有个应用发挥的地方。二是平常可以给自己的学习有个记录备忘的地方。 16 | 17 | 启动 18 | ------ 19 | npm i 20 | 21 | 后端启动: node server/app.js 22 | 23 | 前端启动: npm start 24 | 25 | 界面展示 26 | ------ 27 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/1.png) 28 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/2.png) 29 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/3.png) 30 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/4.png) 31 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/5.png) 32 | ![Alt text](https://github.com/jayo409/react-blog/blob/master/images/6.png) 33 | -------------------------------------------------------------------------------- /config/env.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const paths = require('./paths'); 6 | 7 | // Make sure that including paths.js after env.js will read .env variables. 8 | delete require.cache[require.resolve('./paths')]; 9 | 10 | const NODE_ENV = process.env.NODE_ENV; 11 | if (!NODE_ENV) { 12 | throw new Error( 13 | 'The NODE_ENV environment variable is required but was not specified.' 14 | ); 15 | } 16 | 17 | // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use 18 | var dotenvFiles = [ 19 | `${paths.dotenv}.${NODE_ENV}.local`, 20 | `${paths.dotenv}.${NODE_ENV}`, 21 | // Don't include `.env.local` for `test` environment 22 | // since normally you expect tests to produce the same 23 | // results for everyone 24 | NODE_ENV !== 'test' && `${paths.dotenv}.local`, 25 | paths.dotenv, 26 | ].filter(Boolean); 27 | 28 | // Load environment variables from .env* files. Suppress warnings using silent 29 | // if this file is missing. dotenv will never modify any environment variables 30 | // that have already been set. 31 | // https://github.com/motdotla/dotenv 32 | dotenvFiles.forEach(dotenvFile => { 33 | if (fs.existsSync(dotenvFile)) { 34 | require('dotenv').config({ 35 | path: dotenvFile, 36 | }); 37 | } 38 | }); 39 | 40 | // We support resolving modules according to `NODE_PATH`. 41 | // This lets you use absolute paths in imports inside large monorepos: 42 | // https://github.com/facebookincubator/create-react-app/issues/253. 43 | // It works similar to `NODE_PATH` in Node itself: 44 | // https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders 45 | // Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. 46 | // Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. 47 | // https://github.com/facebookincubator/create-react-app/issues/1023#issuecomment-265344421 48 | // We also resolve them to make sure all tools using them work consistently. 49 | const appDirectory = fs.realpathSync(process.cwd()); 50 | process.env.NODE_PATH = (process.env.NODE_PATH || '') 51 | .split(path.delimiter) 52 | .filter(folder => folder && !path.isAbsolute(folder)) 53 | .map(folder => path.resolve(appDirectory, folder)) 54 | .join(path.delimiter); 55 | 56 | // Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be 57 | // injected into the application via DefinePlugin in Webpack configuration. 58 | const REACT_APP = /^REACT_APP_/i; 59 | 60 | function getClientEnvironment(publicUrl) { 61 | const raw = Object.keys(process.env) 62 | .filter(key => REACT_APP.test(key)) 63 | .reduce( 64 | (env, key) => { 65 | env[key] = process.env[key]; 66 | return env; 67 | }, 68 | { 69 | // Useful for determining whether we’re running in production mode. 70 | // Most importantly, it switches React into the correct mode. 71 | NODE_ENV: process.env.NODE_ENV || 'development', 72 | // Useful for resolving the correct path to static assets in `public`. 73 | // For example, . 74 | // This should only be used as an escape hatch. Normally you would put 75 | // images into the `src` and `import` them in code to get their paths. 76 | PUBLIC_URL: publicUrl, 77 | } 78 | ); 79 | // Stringify all values so we can feed into Webpack DefinePlugin 80 | const stringified = { 81 | 'process.env': Object.keys(raw).reduce((env, key) => { 82 | env[key] = JSON.stringify(raw[key]); 83 | return env; 84 | }, {}), 85 | }; 86 | 87 | return { raw, stringified }; 88 | } 89 | 90 | module.exports = getClientEnvironment; 91 | -------------------------------------------------------------------------------- /config/jest/cssTransform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // This is a custom Jest transformer turning style imports into empty objects. 4 | // http://facebook.github.io/jest/docs/tutorial-webpack.html 5 | 6 | module.exports = { 7 | process() { 8 | return 'module.exports = {};'; 9 | }, 10 | getCacheKey() { 11 | // The output is always the same. 12 | return 'cssTransform'; 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /config/jest/fileTransform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | 5 | // This is a custom Jest transformer turning file imports into filenames. 6 | // http://facebook.github.io/jest/docs/tutorial-webpack.html 7 | 8 | module.exports = { 9 | process(src, filename) { 10 | return `module.exports = ${JSON.stringify(path.basename(filename))};`; 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /config/paths.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | const url = require('url'); 6 | 7 | // Make sure any symlinks in the project folder are resolved: 8 | // https://github.com/facebookincubator/create-react-app/issues/637 9 | const appDirectory = fs.realpathSync(process.cwd()); 10 | const resolveApp = relativePath => path.resolve(appDirectory, relativePath); 11 | 12 | const envPublicUrl = process.env.PUBLIC_URL; 13 | 14 | function ensureSlash(path, needsSlash) { 15 | const hasSlash = path.endsWith('/'); 16 | if (hasSlash && !needsSlash) { 17 | return path.substr(path, path.length - 1); 18 | } else if (!hasSlash && needsSlash) { 19 | return `${path}/`; 20 | } else { 21 | return path; 22 | } 23 | } 24 | 25 | const getPublicUrl = appPackageJson => 26 | envPublicUrl || require(appPackageJson).homepage; 27 | 28 | // We use `PUBLIC_URL` environment variable or "homepage" field to infer 29 | // "public path" at which the app is served. 30 | // Webpack needs to know it to put the right 9 | 10 | 24 | 25 | 26 |
27 |

IconFont 图标

28 | 175 | 176 | 177 |

symbol引用

178 |
179 | 180 |

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 181 | 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:

182 | 188 |

使用步骤如下:

189 |

第一步:引入项目下面生成的symbol代码:

190 |
<script src="./iconfont.js"></script>
191 |

第二步:加入通用css代码(引入一次就行):

192 |
<style type="text/css">
193 | .icon {
194 |    width: 1em; height: 1em;
195 |    vertical-align: -0.15em;
196 |    fill: currentColor;
197 |    overflow: hidden;
198 | }
199 | </style>
200 |

第三步:挑选相应图标并获取类名,应用于页面:

201 |
<svg class="icon" aria-hidden="true">
202 |   <use xlink:href="#icon-xxx"></use>
203 | </svg>
204 |         
205 |
206 | 207 | 208 | -------------------------------------------------------------------------------- /src/static/font/demo_unicode.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | IconFont 7 | 8 | 9 | 29 | 30 | 31 |
32 |

IconFont 图标

33 | 144 |

unicode引用

145 |
146 | 147 |

unicode是字体在网页端最原始的应用方式,特点是:

148 | 153 |
154 |

注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式

155 |
156 |

unicode使用步骤如下:

157 |

第一步:拷贝项目下面生成的font-face

158 |
@font-face {
159 |   font-family: 'iconfont';
160 |   src: url('iconfont.eot');
161 |   src: url('iconfont.eot?#iefix') format('embedded-opentype'),
162 |   url('iconfont.woff') format('woff'),
163 |   url('iconfont.ttf') format('truetype'),
164 |   url('iconfont.svg#iconfont') format('svg');
165 | }
166 | 
167 |

第二步:定义使用iconfont的样式

168 |
.iconfont{
169 |   font-family:"iconfont" !important;
170 |   font-size:16px;font-style:normal;
171 |   -webkit-font-smoothing: antialiased;
172 |   -webkit-text-stroke-width: 0.2px;
173 |   -moz-osx-font-smoothing: grayscale;
174 | }
175 | 
176 |

第三步:挑选相应图标并获取字体编码,应用于页面

177 |
<i class="iconfont">&#x33;</i>
178 | 179 |
180 |

"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。

181 |
182 |
183 | 184 | 185 | 186 | 187 | -------------------------------------------------------------------------------- /src/static/font/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1520087058915'); /* IE9*/ 4 | src: url('iconfont.eot?t=1520087058915#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABE4AAsAAAAAHIgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZXAkjuY21hcAAAAYAAAADzAAAC1JuJNAhnbHlmAAACdAAADBoAABP4oNjNVmhlYWQAAA6QAAAAMQAAADYQn+YNaGhlYQAADsQAAAAgAAAAJAfeA5RobXR4AAAO5AAAABgAAABQT+n//mxvY2EAAA78AAAAKgAAACow8CvybWF4cAAADygAAAAfAAAAIAErARBuYW1lAAAPSAAAAUUAAAJtPlT+fXBvc3QAABCQAAAAqAAAAPyrGDj9eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/s84gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDz7y9zwv4EhhrmBYQpQmBEkBwA5HA2EeJzFks1qAkEQhGvU+LOa9e+goEgIQXLIRcWbb+TJ2z6VD+TJUz2BV9HqrSWgkNxCuvl2me6BLqYawAuAuvgSDSCdkRBxUjWV9Tqyst7AUecFBqrkKJjYYsacU8655IZb7rjngdfbTfcKoupPOFN/9dT/OZJmLPBW5Ts+lJ/fGf1XzW9JeV/KulLTRk+qhhhhjCY6UlrTteavU/400v+Nfoxe+b1Up7EoKiSRMHpPMBm9rHwziH9mYk+YG707ODGxG5waeQHOTOwU50b+gEsTirgy8gxcG7kHbox8BLcmNHNn5C24N3IZPJjYW14Nane3ZlMbAHicvVdrkBTVFe5zb/ftx0x3bz+mZ2eWndmZngcL7LI7szPDQ3cBQV0XEINR1JWHBoIYCb7AIFJrHmiljFhqjIkpXYMFlfyI0bI0KQXBVAWNf1JKlQRZ35WXGq1IqhLd6c253buKFVKxUpqe6Xv7nntu9znnnvOdcwVJECZep0/RVsERpgu9wmJhhSAAmwl5g7RDrtzXTWZCIiclkq5By345J/v5bno6JPPM9Sr1vlKSycwEAzJQzVXq5W5ShlpfP5kPFa8dINWWXmkXp9n0DtBay5nvBOeQn0Ai608z+7uCwVkDbqXDUbbFbTtl27cpTJIUQkTTgKuSniqpGgseksx04qlsJ8lCPFVOL71I72iz193at7m9mFQBRkbAaesw9g1YaQv/O9KeY6fkFl1pTet+wYVtb8VanXh76U0BLwV1fU4E2hCoIAsxwQx1niX0CIKTS+QSVcsH3k/+wK91QzlnQMJyvWSuH2pWX4nmrJzjW9U7yWDziePHoQiF4PjUTQpXgdsyfrwlkWihj2P7m2aBHL9zcJBcMnjVhABCcbA4WIDHn2hxIWIMezJoJppPkOPIzMVE6YSJr9GnyTuCLtSEOu5HBpIGyChNPzR6oa/ewL4WDXHKY3ICuwzIOEYqsuJwLsDEgaYkNQ/s5+3+4K+xmLW8VkP6hjWXbQYoVqddVIzH6KJBEN995JF3RRg6g7yD/AfGJWn8AK5tspgtKhnNrO9ZunELwNVf7Xx4iS236pIXnzd66aNvS9Lbj65+cD7KLKPMf6YP041Ci5AWSkJFWC6sEa5C2fOzodSoD0DdS3rcURoy62VZaPSVnY81MIBGQocK0HwpUjHSxWX5Um2Kr5EvlZHcDf1c4aTLIN9b5vzz0UgGwCpNXW1Sam5VLaaRFDFiWwHomhT5ZmSFSLe9Y5I0tnfvK6L4yl4my2zFlYRcuQJbJaaQ7cPD2wnZ/j6T0b+ukBjV2DXfJUpwCGzO6zAFFLCUpYbdwmZSSdZbro8b980ASpdtE0kwII1PfmX/OF0oju3bOyaKY3v3jTUfUuIykE0rzttEyKbzJEWRhrdTun34khufU6TN+7KgxSTIPb5NUmAIUBJ+c39Ar5g4RA/SBcIM4RxBkHL50ungJwzw8als+flSA+qVLKCRorBLei5GsOWyctXitHLI77LZANWKl7CqNW4vfKLrgqai/QA0OfhQ1mBuXFXh55IurUfK9xXtDqbJ87V/voqjadewqxPKDcG32hTtDU15UtEGNOXECUXTFDiSVGCrKF40xEdv3yS1aMEsRSvAi4p2OVNeXxdT5Y3BY5oSdJ2QYzE5jMMRUaAjYQT6QlloCPOFIeFc9BaZcX/pGwgV8tyinGxADjcc9WjkcMMtdBUMQSvUvJ9jjjdFS+I8hiqTJ/kdpNH3j7V0trxsmi9jd8wMPjh69KXmT4PDrR0AHa0wN+qDwzD3VLTDfMAfp6aCw2TZMdP85J3vHH3ppab5qWXYX42LD3ekYE6qoyMVPJvilGdvh5Pf1NoR7Ia50d7eQp+nm4R+4QLU3y/5CDhesjcK+Slv53EiVxmGeb2RaJTlkgFeFnhweMkw9KthuEh5uVdOcLZqpdHbwB7JFkYUAzVm2mAuvxDEI6OOZS9ZKS6/AMTf/nAGtICb1W4eAS1rQ7zrlx+IGy6h67/suon9H0qwIXhSVa5EFlNV6uBkbAQs8hjDsaXW96wZPSIC0WaL+PijF7TOmGM4RIebboY4uBmtS/vHr65+up/N0QlIH+7fcmgXWwKaY9rM/8h0wDFhnmlHNoj8oYAZCBGDybiNPm4jIm69isjbV+I4LFuoao5r1FcCr4JO31fKy8Bc+qphQ7Z1/G+t2Wwriem2rTf/Xl0MsLhKDezt8ffUNpUcUZ201uzSSNExmieSHZBN0hbs7Dabs46/Hy0hccMJzlFV8qKWdjl/ehKTj2EMFoQu9NP1glDsxt1hCRe3oYQAVIZuwJ1zvSrKyPFaxm10vUaFI19fmXYDS7rhlpnAM+cA3xnOk4FKyAF5Do4zgb8DYzNaVqLLJF0xXUXqXFwjhAa39Fx3pum6ZmO4ALsKq3p7ZDVpKrp0eTy+QUungWmdjcvK16po/C0dQ51dCCVO2rxC05pjprbNX9ZD+Wrav2H2dk0z/sAYcU3ZkDqVmSKB79XmgNtuQVdnsKm9KM1iLbLpEEQpvUMnd8VF19Q466zSVi3laluRpSuUTtugTdOCPer2fI6v7+q8Ca2tRja7n7xA1woG5oQZuLOYAlxU2ueAXa1whbuBWyKDVgHPQEtGsZ8B8hSTVFWKM91xdDZnqZJOUCVsH9gMKxSaSKnBqCzvjBUMeikRtbQmSk7auXutRq1ULGyfvy04P5ayqAYHVU8dNVhOmJLpdyfJhPWLywOIFzN+Pgs8ZmajXAZkARgPONwJxCRMLov/s0zBL0KZYO3/IJOIMh2kh+hCrEmSwo1AQ+8ql+qfSo2VOg9wNN1AJA/6C0NcR0b0Oznhyr1skuoicjLuSWFZgIg/SeOOluzF/MCpvILoh0kqfx9mhKiq4Ljj8/fgn2MwdhyTI0J76KQ8AfE1EXkKsSPCTC5SmIq4D0fkKTyPCLg2TD/JBJcqIlcmvxQReDJPwvvrb1XEe67dchel969ffSOIN1y8eiel+KBJkqinUotSZ6d0SYN651BnHSRJiqfPRmJKF0UMhDrghMpEipwL02eldVFiUJ++dDpOaKKOlIXpdFyUJI1T6nFo96YzSpkiUtGPxxfFC3peZIplqwxa7fO9DFNtS2E4V9AX6jhHREWmhE3nhS5fS6isIDGv43Qh7k+uzXhDyMBUy8a1eZxYFI+Ha/m3+Nob1VvWX/8ApXd//bp74C26c/VFN4g7Vg/vWBlDHc9OL0R9qMjUKX0QBkKFUHUxNqk6V2dSc0JYpM/0T4yEqk8a6Wf/JoqP2oai9DitpzCAJIXcqN+QlwFp0gK6P2UBlYUWyGRC/ZkikXApMkRLVQmXTsbdwbCGYUKrcAbGnethwLEQ/Rrcb/LoW71YaXM4RVxNYhL8uOb1kjUPA7SBeaBU/rhSLFGpA6/gPlX+IyK4+YbabtswrrqGLXaCeHTPnqMitmvOlVXdhpg6vDmqh7EFste27aJtB1lpl+o66rc1WyfBe7oD11tgG6oM566JlmML+Dbb0EyxB6Ll2G6J4vbXGLdnII7UhUXCIGr12YUvYjar1PmZIs+SFj9M8UydZ43IMHT3Z9KjeYinL/wfCrMYNs9wm5AVn1GLruAgRzNYwJPmSc/fiMyDJxBhYjfdTIdPOjMlhTYhi3VbF2brmnApao2VVhnvk09P/OdUE34C7yTeRTxe5Wp+ImcBjigeocpYwWLirPXWBwg3TR/iG1b9/DjjIZz5TEYkSPZSoemTsf7mA2Rd8/fwWtBx8h0cx0scG4OdbnN0gLwSzB4b637ttRkw/bTpILW5oIsySEAtOlMyCJEVoDE0kkSHx3/cT/4UXJnvy3fiTdbzB//NgWbKXE7XB3/xIRl81Asx04x1eXFF0VwsginxY1RzlCzBgwJYmqrFuW+TiWDiXqxf1mIdu5Bbg5cqLuY2wrWpo254PCa8bsmdmoy4XuOFDq/d6WjzIEZ0Yf7cMsnPzdgpzapeOk9csPbyeUBGTkmGenObbZAFhk3XYpg3F2R7XatyWp+niGlf0gurvrJyWu5Lfdxep54h+MWJUcO2jdHJ8yc2K8k6YbFwvrARNSqWmIxpyA/PXXxXvH5E+TApIlxXvXrDkXCep81wvh/joPTxNHq2Uy810M9dnv95+dPgxU0+TLwuiyi8yiMrgiNqnCySE8m47cjTbEMUVZPJpmL4c/Sib0i5LqMfxHmsqHKGNsdRDYYHKckoNIySbzG/Bw/B2l5mxdlZZ7G4xVY+yJ8dvPgolU6TuWVQleBwIkbRCBaleD5klom4KheW1BUKrUWYmQ+OeRoQsQ0ZJCJbZsjl8/l8Bk5TDSwCWtjQM0P85Re+qfGR01Pvcfg4NXDmwOS5DZu3Qjuu+pysmPwCrbbqC7HUolPaRgx97BC5N7TNRmHH5+pln7aP/H/0vBNcyUqtVuE2nDN//q4v3BMv5vatjuweqfDXz9k9enviv/vmvwD0qEZNAAB4nGNgZGBgAOKzc97siee3+crAzcIAAtcOXBSC0f///c9hYWRuAHI5GJhAogCGhw2uAAAAeJxjYGRgYG7438AQw8Lw/9///yyMDEARFCACAKC8Bnl4nGNhYGBgfsnAwMJALv7/D5kPAGw/AzYAAAAAAHYAygEkAdICOgLAA0IDlAQuBHgEwgY0Bp4HEAeiCAoIrgk8CfwAAHicY2BkYGAQYWRh4GUAASYg5gJCBob/YD4DAAwPAT0AeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbYtbDoJAEAS3FVHAt3gQ9USrrjC4zqIwceH0Qkj4sj86lVRKTdSwWP1figmmCDBDiDkWiBAjwRIrrLHBFjvscUCKo4KPr+5pPPHXcEA3x8sqF/ZydQ/NWZC7l0l0WVq66Zo6e9f8Fi+ci+aVJWk0l8SZFU4qoYKGbuGp+1bcAI2TMOsCS+Hg563musuSzHwMF9SrWUNsTdR/35xHOo10UeoHBNxCyA==') format('woff'), 6 | url('iconfont.ttf?t=1520087058915') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1520087058915#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-bokexinwen:before { content: "\e6fd"; } 19 | 20 | .icon-icon:before { content: "\e61b"; } 21 | 22 | .icon-shunxubofang:before { content: "\e671"; } 23 | 24 | .icon-home:before { content: "\e60a"; } 25 | 26 | .icon-application:before { content: "\e63c"; } 27 | 28 | .icon-danquxunhuan:before { content: "\e607"; } 29 | 30 | .icon-liuyanpinglun:before { content: "\e61c"; } 31 | 32 | .icon-suijibofang:before { content: "\e66b"; } 33 | 34 | .icon-xiangzuo:before { content: "\e617"; } 35 | 36 | .icon-xiangyou:before { content: "\e618"; } 37 | 38 | .icon-guanli:before { content: "\e626"; } 39 | 40 | .icon-bofang:before { content: "\e600"; } 41 | 42 | .icon-zanting:before { content: "\e601"; } 43 | 44 | .icon-gerenjianli:before { content: "\e60e"; } 45 | 46 | .icon-yinle:before { content: "\e631"; } 47 | 48 | .icon-yinliang2:before { content: "\e632"; } 49 | 50 | .icon-yinliang1:before { content: "\e633"; } 51 | 52 | .icon-yinliang3:before { content: "\e635"; } 53 | 54 | -------------------------------------------------------------------------------- /src/static/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/font/iconfont.eot -------------------------------------------------------------------------------- /src/static/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/font/iconfont.ttf -------------------------------------------------------------------------------- /src/static/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/font/iconfont.woff -------------------------------------------------------------------------------- /src/static/images/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/images/avatar.jpg -------------------------------------------------------------------------------- /src/static/images/blog-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/images/blog-bg.png -------------------------------------------------------------------------------- /src/static/images/wrap-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/images/wrap-bg.png -------------------------------------------------------------------------------- /src/static/music/山丘.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayo409/react-blog/6b429e549a479329a61e2ebd061a366f56493df2/src/static/music/山丘.mp3 --------------------------------------------------------------------------------