├── .angular-cli.json ├── .editorconfig ├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── docs ├── 1.6084fd2574733b9b8f1c.jpg ├── 10.4f242417d136861b0983.jpg ├── 2.eedf1a27ac2483af08fb.jpg ├── 3.6582b2593d6fa36d225e.jpg ├── 3rdpartylicenses.txt ├── 4.5e3032965832c883d0ab.jpg ├── 5.c4ab0002b6ec34beedde.jpg ├── 6.794cc1e4903d66438b33.jpg ├── 7.916943b50468dd007104.jpg ├── 8.1448366f152b40071c09.jpg ├── 9.807aeaa6ff4269579383.jpg ├── CNAME ├── assets │ ├── css │ │ ├── common.css │ │ ├── main.css │ │ └── project.css │ └── img │ │ ├── 1.jpg │ │ ├── 10.jpg │ │ ├── 11.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ ├── 7.jpg │ │ ├── 8.jpg │ │ ├── 9.jpg │ │ ├── angular.jpg │ │ ├── big-circle.png │ │ ├── block.png │ │ ├── course.png │ │ ├── diamond.png │ │ ├── feteam.jpg │ │ ├── feweekly.jpg │ │ ├── formbuilder.jpg │ │ ├── gis520.jpg │ │ ├── gis520.png │ │ ├── graphql.jpg │ │ ├── header-icon1.png │ │ ├── jzt.png │ │ ├── leaf.png │ │ ├── live.jpg │ │ ├── nav.png │ │ ├── npm.jpg │ │ ├── pwa.jpg │ │ ├── react.jpg │ │ ├── rn.jpg │ │ ├── small-circle.png │ │ ├── triangle.png │ │ ├── vdom.jpg │ │ ├── vue.jpg │ │ └── webcomponents.jpg ├── big-circle.969431f8d648c59755fa.png ├── block.0a96eda7272e329c7b90.png ├── data │ └── data.json ├── diamond.454689b5ab7b8692c1f1.png ├── favicon.ico ├── gis520.0be815c44cd71c57af6a.png ├── index.html ├── inline.0420f7c5bc23f160806d.bundle.js ├── jzt.fd03bcc5d11357137710.png ├── leaf.d0864f3f22f32f4b4651.png ├── main.1dae3fd3cc866b172c03.bundle.js ├── nav.ab4683ad05898b35b297.png ├── polyfills.c2099cdb9b4ef729ae00.bundle.js ├── small-circle.771cfdc0c72adb7fd566.png ├── styles.1749a1c5d93c28c69f58.bundle.css └── triangle.79de0af5a0f1ae590e02.png ├── e2e ├── app.e2e-spec.ts ├── app.po.ts └── tsconfig.e2e.json ├── karma.conf.js ├── package.json ├── protractor.conf.js ├── screenshot ├── demo-cp.gif ├── demo.gif ├── demo.png └── demo │ ├── jzt.gif │ └── jzt_compress.gif ├── scripts └── cname.js ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.ts │ ├── app.module.ts │ ├── banner-head │ │ ├── banner-head.component.html │ │ ├── banner-head.component.scss │ │ └── banner-head.component.ts │ └── project-item │ │ ├── project-item.component.html │ │ ├── project-item.component.scss │ │ └── project-item.component.ts ├── assets │ ├── .gitkeep │ ├── css │ │ ├── common.css │ │ ├── main.css │ │ └── project.css │ └── img │ │ ├── 1.jpg │ │ ├── 10.jpg │ │ ├── 11.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ ├── 7.jpg │ │ ├── 8.jpg │ │ ├── 9.jpg │ │ ├── angular.jpg │ │ ├── big-circle.png │ │ ├── block.png │ │ ├── course.png │ │ ├── diamond.png │ │ ├── feteam.jpg │ │ ├── feweekly.jpg │ │ ├── formbuilder.jpg │ │ ├── gis520.jpg │ │ ├── gis520.png │ │ ├── graphql.jpg │ │ ├── header-icon1.png │ │ ├── jzt.png │ │ ├── leaf.png │ │ ├── live.jpg │ │ ├── nav.png │ │ ├── npm.jpg │ │ ├── pwa.jpg │ │ ├── react.jpg │ │ ├── rn.jpg │ │ ├── small-circle.png │ │ ├── triangle.png │ │ ├── vdom.jpg │ │ ├── vue.jpg │ │ └── webcomponents.jpg ├── data │ └── data.json ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── mock-data │ ├── nav-data.ts │ └── project-data.ts ├── polyfills.ts ├── styles.scss ├── test.ts ├── tsconfig.app.json ├── tsconfig.spec.json └── typings.d.ts ├── tsconfig.json └── tslint.json /.angular-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "project": { 4 | "name": "project" 5 | }, 6 | "apps": [ 7 | { 8 | "root": "src", 9 | "outDir": "docs", 10 | "assets": [ 11 | "assets", 12 | "data", 13 | "favicon.ico" 14 | ], 15 | "index": "index.html", 16 | "main": "main.ts", 17 | "polyfills": "polyfills.ts", 18 | "test": "test.ts", 19 | "tsconfig": "tsconfig.app.json", 20 | "testTsconfig": "tsconfig.spec.json", 21 | "prefix": "app", 22 | "styles": [ 23 | "./assets/css/common.css", 24 | "./assets/css/main.css", 25 | "./assets/css/project.css", 26 | "styles.scss" 27 | ], 28 | "scripts": [], 29 | "environmentSource": "environments/environment.ts", 30 | "environments": { 31 | "dev": "environments/environment.ts", 32 | "prod": "environments/environment.prod.ts" 33 | } 34 | } 35 | ], 36 | "e2e": { 37 | "protractor": { 38 | "config": "./protractor.conf.js" 39 | } 40 | }, 41 | "lint": [ 42 | { 43 | "project": "src/tsconfig.app.json" 44 | }, 45 | { 46 | "project": "src/tsconfig.spec.json" 47 | }, 48 | { 49 | "project": "e2e/tsconfig.e2e.json" 50 | } 51 | ], 52 | "test": { 53 | "karma": { 54 | "config": "./karma.conf.js" 55 | } 56 | }, 57 | "defaults": { 58 | "styleExt": "scss", 59 | "component": {} 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | # /docs 6 | /tmp 7 | /out-tsc 8 | 9 | # dependencies 10 | /node_modules 11 | 12 | # IDEs and editors 13 | /.idea 14 | .project 15 | .classpath 16 | .c9/ 17 | *.launch 18 | .settings/ 19 | *.sublime-workspace 20 | 21 | # IDE - VSCode 22 | .vscode/* 23 | !.vscode/settings.json 24 | !.vscode/tasks.json 25 | !.vscode/launch.json 26 | !.vscode/extensions.json 27 | package-lock.json 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /coverage 32 | /libpeerconnection.log 33 | npm-debug.log 34 | testem.log 35 | /typings 36 | 37 | # e2e 38 | /e2e/*.js 39 | /e2e/*.map 40 | 41 | # System Files 42 | .DS_Store 43 | Thumbs.db 44 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | project.giscafer.com 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # project 2 | SPA site for displaying owner project built with angular,模板仿慕课 3 | 4 | [Online Site](http://project.giscafer.com) 5 | 6 | 7 | ## Screenshot 8 | 9 | ![](./screenshot/demo.gif) 10 | 11 | 12 | ## Usage 13 | 14 | ### run 15 | 16 | > npm install 17 | 18 | > npm run start 19 | 20 | ### build 21 | 22 | > npm run build:aot 23 | 24 | 25 | ## License 26 | 27 | MIT 28 | 29 | --- 30 | 31 | > [giscafer.com](http://giscafer.com)  ·  32 | > GitHub [@giscafer](https://github.com/giscafer)  ·  33 | > Weibo [@Nickbing Lao](https://weibo.com/laohoubin) 34 | 35 | -------------------------------------------------------------------------------- /docs/1.6084fd2574733b9b8f1c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/1.6084fd2574733b9b8f1c.jpg -------------------------------------------------------------------------------- /docs/10.4f242417d136861b0983.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/10.4f242417d136861b0983.jpg -------------------------------------------------------------------------------- /docs/2.eedf1a27ac2483af08fb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/2.eedf1a27ac2483af08fb.jpg -------------------------------------------------------------------------------- /docs/3.6582b2593d6fa36d225e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/3.6582b2593d6fa36d225e.jpg -------------------------------------------------------------------------------- /docs/3rdpartylicenses.txt: -------------------------------------------------------------------------------- 1 | core-js@2.6.5 2 | MIT 3 | Copyright (c) 2014-2019 Denis Pushkarev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | 23 | zone.js@0.8.29 24 | MIT 25 | The MIT License 26 | 27 | Copyright (c) 2016-2018 Google, Inc. 28 | 29 | Permission is hereby granted, free of charge, to any person obtaining a copy 30 | of this software and associated documentation files (the "Software"), to deal 31 | in the Software without restriction, including without limitation the rights 32 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 33 | copies of the Software, and to permit persons to whom the Software is 34 | furnished to do so, subject to the following conditions: 35 | 36 | The above copyright notice and this permission notice shall be included in 37 | all copies or substantial portions of the Software. 38 | 39 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 40 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 41 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 42 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 43 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 44 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 45 | THE SOFTWARE. 46 | 47 | webpack@3.10.0 48 | MIT 49 | Copyright JS Foundation and other contributors 50 | 51 | Permission is hereby granted, free of charge, to any person obtaining 52 | a copy of this software and associated documentation files (the 53 | 'Software'), to deal in the Software without restriction, including 54 | without limitation the rights to use, copy, modify, merge, publish, 55 | distribute, sublicense, and/or sell copies of the Software, and to 56 | permit persons to whom the Software is furnished to do so, subject to 57 | the following conditions: 58 | 59 | The above copyright notice and this permission notice shall be 60 | included in all copies or substantial portions of the Software. 61 | 62 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 63 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 64 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 65 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 66 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 67 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 68 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 69 | 70 | @angular/platform-browser@5.2.11 71 | MIT 72 | MIT 73 | 74 | @angular/core@5.2.11 75 | MIT 76 | MIT 77 | 78 | @angular/http@5.2.11 79 | MIT 80 | MIT 81 | 82 | @angular/forms@5.2.11 83 | MIT 84 | MIT 85 | 86 | @angular/common@5.2.11 87 | MIT 88 | MIT 89 | 90 | css-loader@0.28.11 91 | MIT 92 | Copyright JS Foundation and other contributors 93 | 94 | Permission is hereby granted, free of charge, to any person obtaining 95 | a copy of this software and associated documentation files (the 96 | 'Software'), to deal in the Software without restriction, including 97 | without limitation the rights to use, copy, modify, merge, publish, 98 | distribute, sublicense, and/or sell copies of the Software, and to 99 | permit persons to whom the Software is furnished to do so, subject to 100 | the following conditions: 101 | 102 | The above copyright notice and this permission notice shall be 103 | included in all copies or substantial portions of the Software. 104 | 105 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 106 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 107 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 108 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 109 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 110 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 111 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 112 | 113 | @angular/router@5.2.11 114 | MIT 115 | MIT 116 | 117 | @angular/platform-browser-dynamic@5.2.11 118 | MIT 119 | MIT -------------------------------------------------------------------------------- /docs/4.5e3032965832c883d0ab.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/4.5e3032965832c883d0ab.jpg -------------------------------------------------------------------------------- /docs/5.c4ab0002b6ec34beedde.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/5.c4ab0002b6ec34beedde.jpg -------------------------------------------------------------------------------- /docs/6.794cc1e4903d66438b33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/6.794cc1e4903d66438b33.jpg -------------------------------------------------------------------------------- /docs/7.916943b50468dd007104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/7.916943b50468dd007104.jpg -------------------------------------------------------------------------------- /docs/8.1448366f152b40071c09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/8.1448366f152b40071c09.jpg -------------------------------------------------------------------------------- /docs/9.807aeaa6ff4269579383.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/9.807aeaa6ff4269579383.jpg -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | project.giscafer.com 2 | -------------------------------------------------------------------------------- /docs/assets/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f3f5f7; 3 | } 4 | 5 | #main { 6 | padding-top: 0; 7 | background-color: #f3f5f7; 8 | } 9 | 10 | 11 | /* banner start*/ 12 | 13 | @keyframes spin1 { 14 | 100% { 15 | transform: rotate(360deg); 16 | transform-origin: 50% 50%; 17 | } 18 | } 19 | 20 | @keyframes spin2 { 21 | 100% { 22 | transform: rotate(-360deg); 23 | transform-origin: 50% 50%; 24 | } 25 | } 26 | 27 | 28 | /* 方块 */ 29 | 30 | .image1 { 31 | animation: spin2 382s linear infinite; 32 | } 33 | 34 | 35 | /* 菱形 */ 36 | 37 | .image2 { 38 | animation: spin1 618s linear infinite; 39 | } 40 | 41 | 42 | /* 叶子 */ 43 | 44 | .image3 { 45 | animation: spin1 618s linear infinite; 46 | } 47 | 48 | 49 | /* 三角 */ 50 | 51 | .image4 { 52 | animation: spin1 1024s linear infinite; 53 | } 54 | 55 | * { 56 | margin: 0; 57 | padding: 0; 58 | text-decoration: none; 59 | font-weight: normal; 60 | font-family: "Microsoft YaHei"; 61 | } 62 | 63 | .MMM { 64 | position: absolute; 65 | left: 0; 66 | right: 0; 67 | bottom: 0; 68 | top: 0; 69 | background: rgba(0, 0, 0, 0.2); 70 | z-index: 9; 71 | } 72 | 73 | .wrap { 74 | width: 100%; 75 | height: 300px; 76 | position: relative; 77 | } 78 | 79 | .program-banner-absolute { 80 | position: absolute; 81 | width: 3174px; 82 | height: 2624px; 83 | left: 50%; 84 | margin-left: -1587px; 85 | top: 50%; 86 | margin-top: -940px; 87 | } 88 | 89 | .program-banner-wrap { 90 | width: 100%; 91 | height: 300px; 92 | position: relative; 93 | background-color: #1b324a; 94 | overflow: hidden; 95 | } 96 | 97 | .program-banner-bk { 98 | width: 3174px; 99 | height: 2624px; 100 | position: relative; 101 | } 102 | 103 | .program-banner-bk>div { 104 | background-size: contain; 105 | background-repeat: no-repeat; 106 | opacity: 0.6; 107 | filter: alpha(opacity=60); 108 | } 109 | 110 | .svg-block { 111 | position: absolute; 112 | width: 848px; 113 | height: 848px; 114 | left: 0; 115 | top: 0; 116 | background: url(../img/block.png); 117 | z-index: 2; 118 | } 119 | 120 | .svg-diamond { 121 | position: absolute; 122 | width: 1213px; 123 | height: 1213px; 124 | left: 215px; 125 | top: 190px; 126 | background: url(../img/diamond.png); 127 | z-index: 3; 128 | } 129 | 130 | .svg-leaf { 131 | position: absolute; 132 | width: 930px; 133 | height: 930px; 134 | left: 1060px; 135 | top: 450px; 136 | background: url(../img/leaf.png); 137 | z-index: 2; 138 | } 139 | 140 | .svg-small-circle { 141 | position: absolute; 142 | width: 864px; 143 | height: 864px; 144 | right: 478px; 145 | top: 336px; 146 | background: url(../img/small-circle.png); 147 | z-index: 0; 148 | } 149 | 150 | .svg-big-circle { 151 | position: absolute; 152 | width: 1664px; 153 | height: 1664px; 154 | right: 811px; 155 | top: 956px; 156 | background: url(../img/big-circle.png); 157 | z-index: 0; 158 | } 159 | 160 | .svg-triangle { 161 | position: absolute; 162 | width: 1374px; 163 | height: 1184px; 164 | right: 0px; 165 | bottom: 445px; 166 | background: url(../img/triangle.png); 167 | z-index: 1; 168 | } 169 | 170 | 171 | /* banner end*/ 172 | 173 | .program-banner { 174 | width: 100%; 175 | height: 300px; 176 | box-sizing: border-box; 177 | position: relative; 178 | } 179 | 180 | .program-banner .relative { 181 | position: relative; 182 | z-index: 1; 183 | } 184 | 185 | .program-banner .banner-head { 186 | z-index: 10; 187 | } 188 | 189 | .program-banner .banner-head>div { 190 | display: none; 191 | position: absolute; 192 | top: 72px; 193 | left: 0; 194 | right: 0; 195 | } 196 | 197 | .program-banner .banner-head>div.active { 198 | display: block; 199 | } 200 | 201 | .program-banner .program-banner-bk { 202 | position: absolute; 203 | left: 0; 204 | top: 0; 205 | right: 0; 206 | bottom: 0; 207 | overflow: hidden; 208 | background-position: center 24%; 209 | background-size: cover; 210 | } 211 | 212 | .program-banner .tit { 213 | font-size: 36px; 214 | color: #fff; 215 | line-height: 36px; 216 | text-align: center; 217 | text-shadow: 0px 4px 8px rgba(7, 17, 27, 0.4); 218 | letter-spacing: 10px; 219 | margin-bottom: 16px; 220 | } 221 | 222 | .program-banner .intro { 223 | margin-left: auto; 224 | margin-right: auto; 225 | font-size: 14px; 226 | font-weight: 200; 227 | color: #fff; 228 | width: 880px; 229 | line-height: 28px; 230 | height: 56px; 231 | overflow: hidden; 232 | text-align: center; 233 | text-shadow: 0px 4px 8px rgba(7, 17, 27, 0.4); 234 | } 235 | 236 | .program-banner .intro span { 237 | margin: 0 12px; 238 | } 239 | 240 | .program-banner .tab-nav { 241 | position: absolute; 242 | width: 1250px; 243 | height: 120px; 244 | -webkit-box-sizing: border-box; 245 | box-sizing: border-box; 246 | background-color: #fff; 247 | border-radius: 12px; 248 | -webkit-box-shadow: 0px 8px 16px rgba(7, 17, 27, 0.1); 249 | box-shadow: 0px 8px 16px rgba(7, 17, 27, 0.1); 250 | left: 50%; 251 | bottom: -60px; 252 | margin-left: -619px; 253 | padding: 28px 14px 0; 254 | z-index: 10; 255 | } 256 | 257 | .program-banner .navitem { 258 | float: left; 259 | width: 108px; 260 | height: 92px; 261 | text-align: center; 262 | cursor: pointer; 263 | position: relative; 264 | margin: 0 20px; 265 | } 266 | 267 | .program-banner .navitem .navicon { 268 | display: block; 269 | width: 36px; 270 | height: 36px; 271 | margin-left: auto; 272 | margin-right: auto; 273 | margin-bottom: 8px; 274 | transition: .1s all linear; 275 | margin-top: 0; 276 | background-image: url(../img/nav.png); 277 | background-size: cover; 278 | } 279 | 280 | .program-banner .navitem .navicon.course { 281 | background-image: url(../img/course.png); 282 | } 283 | 284 | .program-banner .navitem .navicon.all { 285 | background-position: 0 0; 286 | } 287 | 288 | .program-banner .navitem .navicon.fe { 289 | background-position: -35px 0; 290 | } 291 | 292 | .program-banner .navitem .navicon.php { 293 | background-position: -72px 0; 294 | } 295 | 296 | .program-banner .navitem .navicon.java { 297 | background-position: -106px 0; 298 | } 299 | 300 | .program-banner .navitem .navicon.android { 301 | background-position: -143px 0; 302 | } 303 | 304 | .program-banner .navitem .navicon.ios { 305 | background-position: -180px 0; 306 | } 307 | 308 | .program-banner .navitem .navtext { 309 | font-size: 14px; 310 | color: #93999f; 311 | line-height: 14px; 312 | transition: .3s all linear; 313 | } 314 | 315 | .program-banner .navitem .navbot { 316 | position: absolute; 317 | bottom: 0; 318 | left: 0; 319 | right: 0; 320 | display: none; 321 | height: 2px; 322 | background-color: #f01414; 323 | line-height: 0; 324 | overflow: hidden; 325 | } 326 | 327 | .program-banner .navitem.active .navtext { 328 | color: #07111b; 329 | } 330 | 331 | .program-banner .navitem.active .navbot { 332 | display: block; 333 | } 334 | 335 | .program-banner .navitem:hover .navtext { 336 | color: #07111b; 337 | } 338 | 339 | .program-banner .navitem:hover .navicon { 340 | margin-top: -4px; 341 | } 342 | 343 | .program-list { 344 | width: 1200px; 345 | margin-left: auto; 346 | margin-right: auto; 347 | padding-top: 108px; 348 | text-align: center; 349 | } 350 | 351 | .program-list .program-list-wrap { 352 | display: inline-block; 353 | } 354 | 355 | .program-list .program-item { 356 | margin-right: 32px; 357 | } 358 | 359 | .program-item { 360 | position: relative; 361 | cursor: default; 362 | float: left; 363 | width: 276px; 364 | height: 326px; 365 | transition: all linear .3s; 366 | margin-right: 32px; 367 | margin-bottom: 32px; 368 | text-align: left; 369 | } 370 | 371 | .program-item:nth-child(4n) { 372 | margin-right: 0px; 373 | } 374 | 375 | .program-item:hover .shadow { 376 | box-shadow: 0px 8px 6px 0px rgba(7, 17, 27, 0.2); 377 | } 378 | 379 | .program-item:hover .c-line, 380 | .program-item:hover .d-line { 381 | box-shadow: 0px 8px 6px 0px rgba(7, 17, 27, 0.2); 382 | } 383 | 384 | .program-item:hover .program-list-head>div { 385 | transform: scale(1.2); 386 | } 387 | 388 | #repo-bg-1 { 389 | background-image: url(../img/1.jpg); 390 | } 391 | 392 | #repo-bg-2 { 393 | background-image: url(../img/2.jpg); 394 | } 395 | 396 | #repo-bg-3 { 397 | background-image: url(../img/3.jpg); 398 | } 399 | 400 | #repo-bg-4 { 401 | background-image: url(../img/4.jpg); 402 | } 403 | 404 | #repo-bg-5 { 405 | background-image: url(../img/5.jpg); 406 | } 407 | 408 | #repo-bg-6 { 409 | background-image: url(../img/6.jpg); 410 | } 411 | 412 | #repo-bg-7 { 413 | background-image: url(../img/7.jpg); 414 | } 415 | 416 | #repo-bg-8 { 417 | background-image: url(../img/8.jpg); 418 | } 419 | 420 | #repo-bg-9 { 421 | background-image: url(../img/9.jpg); 422 | } 423 | 424 | #repo-bg-10 { 425 | background-image: url(../img/10.jpg); 426 | } 427 | 428 | #repo-bg-11 { 429 | background-image: url(../img/11.jpg); 430 | } 431 | 432 | 433 | /*#repo-bg-12 { 434 | background-image: url(../img/12.jpg); 435 | }*/ 436 | 437 | .program-item .shadow { 438 | transition: all linear .3s; 439 | box-shadow: 0px 4px 8px 0px rgba(7, 17, 27, 0.1); 440 | overflow: hidden; 441 | } 442 | 443 | .program-item .program-list-head { 444 | height: 96px; 445 | border-top-left-radius: 6px; 446 | border-top-right-radius: 6px; 447 | background-color: #f3f5f7; 448 | overflow: hidden; 449 | } 450 | 451 | .program-item .program-list-head div { 452 | background-size: cover; 453 | transition: all linear .3s; 454 | height: 96px; 455 | } 456 | 457 | .program-item .program-list-cont { 458 | position: relative; 459 | height: 220px; 460 | overflow: hidden; 461 | background-color: #fff; 462 | padding: 0 24px; 463 | border-bottom-right-radius: 6px; 464 | border-bottom-left-radius: 6px; 465 | } 466 | 467 | .program-item .program-list-tit { 468 | width: 100%; 469 | padding: 22px 0 8px; 470 | color: #07111b; 471 | font-size: 16px; 472 | line-height: 28px; 473 | max-height: 55px; 474 | letter-spacing: -0.1px; 475 | text-overflow: ellipsis; 476 | word-break: break-all; 477 | word-wrap: break-word; 478 | overflow: hidden; 479 | text-overflow: -o-ellipsis-lastline; 480 | display: -webkit-box; 481 | -webkit-line-clamp: 2; 482 | -webkit-box-orient: vertical; 483 | } 484 | 485 | .program-item .program-list-dest { 486 | font-size: 12px; 487 | line-height: 24px; 488 | height: 68px; 489 | max-height: 68px; 490 | word-break: normal; 491 | color: #333; 492 | text-overflow: ellipsis; 493 | word-break: break-all; 494 | word-wrap: break-word; 495 | overflow: hidden; 496 | text-overflow: -o-ellipsis-lastline; 497 | display: -webkit-box; 498 | -webkit-line-clamp: 2; 499 | -webkit-box-orient: vertical; 500 | } 501 | 502 | .program-item .program-list-bot { 503 | position: absolute; 504 | height: 24px; 505 | bottom: 24px; 506 | left: 24px; 507 | right: 24px; 508 | } 509 | 510 | .program-item .text { 511 | float: left; 512 | font-size: 13px; 513 | color: #93999f; 514 | line-height: 24px; 515 | } 516 | 517 | .program-item .git { 518 | float: right; 519 | height: 20px; 520 | color: #3b38ff!important; 521 | line-height: 24px; 522 | font-weight: 200; 523 | font-size: 14px; 524 | } 525 | 526 | .program-item .git>a, 527 | .program-item .text>a { 528 | color: #3b38ff!important; 529 | } 530 | 531 | .program-item .c-line, 532 | .program-item .d-line { 533 | transition: all linear .3s; 534 | background-color: #fff; 535 | height: 3px; 536 | margin-left: auto; 537 | margin-right: auto; 538 | border-bottom-right-radius: 6px; 539 | border-bottom-left-radius: 6px; 540 | box-shadow: 0px 4px 8px 0px rgba(7, 17, 27, 0.1); 541 | } 542 | 543 | .program-item .c-line { 544 | width: 264px; 545 | margin-top: 2px; 546 | margin-bottom: 2px; 547 | } 548 | 549 | .program-item .d-line { 550 | width: 252px; 551 | } 552 | 553 | .program-item .learn_rate { 554 | position: absolute; 555 | width: 40px; 556 | height: 24px; 557 | font-size: 12px; 558 | line-height: 24px; 559 | color: #fff; 560 | background-color: #07111b; 561 | font-weight: 200; 562 | text-align: center; 563 | right: -4px; 564 | top: 12px; 565 | z-index: 1; 566 | border-top-left-radius: 6px; 567 | border-bottom-left-radius: 6px; 568 | } 569 | 570 | .program-item .learn_rate:after { 571 | position: absolute; 572 | content: ''; 573 | width: 0; 574 | height: 0; 575 | overflow: hidden; 576 | border-top: 4px solid #07111b; 577 | border-right: 4px solid transparent; 578 | right: 0; 579 | bottom: -4px; 580 | } 581 | 582 | .program-item .learn_rate i { 583 | line-height: 24px; 584 | } 585 | 586 | .program-item .item-new { 587 | position: absolute; 588 | width: 40px; 589 | height: 24px; 590 | border-radius: 20px; 591 | text-align: center; 592 | line-height: 24px; 593 | left: -8px; 594 | top: -8px; 595 | color: #f01414; 596 | border: 2px solid #f01414; 597 | font-size: 12px; 598 | background-color: #fff; 599 | font-weight: 700; 600 | } 601 | 602 | .program-combine { 603 | width: 1200px; 604 | height: 482px; 605 | box-sizing: border-box; 606 | padding-top: 72px; 607 | position: relative; 608 | overflow: hidden; 609 | margin-left: auto; 610 | margin-right: auto; 611 | border-radius: 24px; 612 | margin-top: 36px; 613 | background-color: #e4e6e8; 614 | } 615 | 616 | .program-combine.js-pathCombine-1 { 617 | margin-top: 72px; 618 | } 619 | 620 | .program-combine .program-combine-warp { 621 | overflow: hidden; 622 | padding-left: 82px; 623 | } 624 | 625 | .program-combine .program-combine-scroll { 626 | position: absolute; 627 | padding-top: 64px; 628 | padding-left: 64px; 629 | padding-right: 40px; 630 | left: 0; 631 | top: 0; 632 | width: 1150px; 633 | } 634 | 635 | .program-combine .program-item:last-child .h-line { 636 | display: none; 637 | } 638 | 639 | .program-combine .program-item .item-new { 640 | left: -8px; 641 | } 642 | 643 | .program-combine .program-item .learn_rate { 644 | right: -4px; 645 | } 646 | 647 | .program-combine .program-item .h-line { 648 | position: absolute; 649 | width: 48px; 650 | height: 16px; 651 | top: 50%; 652 | left: 100%; 653 | margin-top: -8px; 654 | background-color: #afb4b9; 655 | } 656 | 657 | .program-combine .combine-l { 658 | float: left; 659 | width: 424px; 660 | padding-top: 32px; 661 | margin-right: 48px; 662 | } 663 | 664 | .program-combine .combine-r { 665 | float: left; 666 | width: 648px; 667 | } 668 | 669 | .program-combine .combine-tit { 670 | font-size: 36px; 671 | color: #07111b; 672 | line-height: 48px; 673 | max-height: 96px; 674 | } 675 | 676 | .program-combine .combine-dest, 677 | .program-combine .combine-intro { 678 | font-size: 16px; 679 | font-weight: 200; 680 | color: #07111b; 681 | line-height: 32px; 682 | } 683 | 684 | .program-combine .combine-intro { 685 | margin: 16px 0; 686 | } 687 | 688 | .program-combine .combine-list { 689 | padding-left: 48px; 690 | } 691 | 692 | .program-combine .program-item { 693 | margin-right: 48px; 694 | } 695 | 696 | .program-combine .combine-scroll-bar { 697 | position: absolute; 698 | left: 82px; 699 | right: 82px; 700 | bottom: 48px; 701 | height: 16px; 702 | display: none; 703 | } 704 | 705 | .program-combine .combine-scroll-bar .c-scroll-l { 706 | width: 100%; 707 | height: 1px; 708 | line-height: 1px; 709 | background: rgba(183, 187, 191, 0.5); 710 | margin-top: 8px; 711 | } 712 | 713 | .program-combine .combine-scroll-bar span { 714 | position: absolute; 715 | width: 128px; 716 | height: 16px; 717 | left: 0; 718 | top: 0; 719 | background-color: #fff; 720 | border-radius: 8px; 721 | box-shadow: 0px 2px 4px rgba(7, 17, 27, 0.1); 722 | transition: 0.3s box-shadow linear; 723 | cursor: pointer; 724 | } 725 | 726 | .program-combine .combine-scroll-bar span:hover { 727 | box-shadow: 0px 4px 8px rgba(7, 17, 27, 0.2); 728 | } -------------------------------------------------------------------------------- /docs/assets/css/project.css: -------------------------------------------------------------------------------- 1 | #repo-bg-gis520 { 2 | background-image: url(../img/gis520.png); 3 | } 4 | #repo-bg-jzt { 5 | background-image: url(../img/jzt.png); 6 | } -------------------------------------------------------------------------------- /docs/assets/img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/1.jpg -------------------------------------------------------------------------------- /docs/assets/img/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/10.jpg -------------------------------------------------------------------------------- /docs/assets/img/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/11.jpg -------------------------------------------------------------------------------- /docs/assets/img/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/2.jpg -------------------------------------------------------------------------------- /docs/assets/img/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/3.jpg -------------------------------------------------------------------------------- /docs/assets/img/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/4.jpg -------------------------------------------------------------------------------- /docs/assets/img/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/5.jpg -------------------------------------------------------------------------------- /docs/assets/img/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/6.jpg -------------------------------------------------------------------------------- /docs/assets/img/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/7.jpg -------------------------------------------------------------------------------- /docs/assets/img/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/8.jpg -------------------------------------------------------------------------------- /docs/assets/img/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/9.jpg -------------------------------------------------------------------------------- /docs/assets/img/angular.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/angular.jpg -------------------------------------------------------------------------------- /docs/assets/img/big-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/big-circle.png -------------------------------------------------------------------------------- /docs/assets/img/block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/block.png -------------------------------------------------------------------------------- /docs/assets/img/course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/course.png -------------------------------------------------------------------------------- /docs/assets/img/diamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/diamond.png -------------------------------------------------------------------------------- /docs/assets/img/feteam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/feteam.jpg -------------------------------------------------------------------------------- /docs/assets/img/feweekly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/feweekly.jpg -------------------------------------------------------------------------------- /docs/assets/img/formbuilder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/formbuilder.jpg -------------------------------------------------------------------------------- /docs/assets/img/gis520.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/gis520.jpg -------------------------------------------------------------------------------- /docs/assets/img/gis520.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/gis520.png -------------------------------------------------------------------------------- /docs/assets/img/graphql.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/graphql.jpg -------------------------------------------------------------------------------- /docs/assets/img/header-icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/header-icon1.png -------------------------------------------------------------------------------- /docs/assets/img/jzt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/jzt.png -------------------------------------------------------------------------------- /docs/assets/img/leaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/leaf.png -------------------------------------------------------------------------------- /docs/assets/img/live.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/live.jpg -------------------------------------------------------------------------------- /docs/assets/img/nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/nav.png -------------------------------------------------------------------------------- /docs/assets/img/npm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/npm.jpg -------------------------------------------------------------------------------- /docs/assets/img/pwa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/pwa.jpg -------------------------------------------------------------------------------- /docs/assets/img/react.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/react.jpg -------------------------------------------------------------------------------- /docs/assets/img/rn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/rn.jpg -------------------------------------------------------------------------------- /docs/assets/img/small-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/small-circle.png -------------------------------------------------------------------------------- /docs/assets/img/triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/triangle.png -------------------------------------------------------------------------------- /docs/assets/img/vdom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/vdom.jpg -------------------------------------------------------------------------------- /docs/assets/img/vue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/vue.jpg -------------------------------------------------------------------------------- /docs/assets/img/webcomponents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/assets/img/webcomponents.jpg -------------------------------------------------------------------------------- /docs/big-circle.969431f8d648c59755fa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/big-circle.969431f8d648c59755fa.png -------------------------------------------------------------------------------- /docs/block.0a96eda7272e329c7b90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/block.0a96eda7272e329c7b90.png -------------------------------------------------------------------------------- /docs/data/data.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "type": [ 3 | "all", 4 | "vue", 5 | "nodejs" 6 | ], 7 | "img": "1", 8 | "title": "Ponitor", 9 | "subtitle": "Vue.js1.x • ES6 • Node.js • MongoDB", 10 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 11 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件), 商品价格趋势分析统计等!", 12 | "demoUrl": "http://project.xinong.wang:18080/", 13 | "gitUrl": "https://github.com/giscafer/Ponitor" 14 | }, 15 | { 16 | "type": [ 17 | "all", 18 | "react" 19 | ], 20 | "img": "react", 21 | "title": "react-ponitor", 22 | "subtitle": "react • react-redux", 23 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 24 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件),商品价格趋势分析统计等!", 25 | "demoUrl": "https://giscafer.github.io/react-ponitor/", 26 | "gitUrl": "https://github.com/giscafer/react-ponitor" 27 | }, 28 | { 29 | "type": [ 30 | "all", 31 | "other", 32 | "java" 33 | ], 34 | "img": "3", 35 | "title": "FinalScheduler", 36 | "subtitle": "JFinal2.0 • Bootstrap • SeaJS • FullCalender.js", 37 | "meta": "终极排班管理系统,灵活排班", 38 | "description": "终极排班管理系统,改变传统的排班模式!", 39 | "demoUrl": "", 40 | "gitUrl": "https://github.com/giscafer/FinalScheduler" 41 | }, 42 | { 43 | "type": [ 44 | "all", 45 | "other", 46 | "css" 47 | ], 48 | "img": "4", 49 | "title": "hexo-theme-cafe", 50 | "subtitle": "HTML • CSS • Hexo", 51 | "meta": "自定义 Hexo 博客框架主题,追求简约、操作简单、阅读舒适度", 52 | "description": "A theme of Hexo that is aimed at pursuit of simplicity, simple operation, reading comfort. 追求简约、操作简单、阅读舒适度", 53 | "demoUrl": "http://blog.giscafer.com/", 54 | "gitUrl": "https://github.com/giscafer/hexo-theme-cafe" 55 | }, 56 | { 57 | "type": [ 58 | "all", 59 | "other", 60 | "wechat" 61 | ], 62 | "img": "6", 63 | "title": "mapshaper-plus", 64 | "subtitle": "HTML • CSS • JavaScript", 65 | "meta": "Generate geojson files for Echarts Map,base on mapshaper", 66 | "description": "基于mapshaper对geojson地图数据的坐标信息进行压缩编码,并提供可直接生成压缩编码后的echarts map数据格式,通过mapshaper-plus可以直接将shp格式数据转换为压缩后的echarts数据", 67 | "demoUrl": "https://giscafer.github.io/mapshaper-plus/", 68 | "gitUrl": "https://github.com/giscafer/mapshaper-plus" 69 | }, 70 | { 71 | "type": [ 72 | "all", 73 | "other", 74 | "wechat" 75 | ], 76 | "img": "5", 77 | "title": "wechat-weapp-mapdemo", 78 | "subtitle": "HTML5 • CSS • JavaScript", 79 | "meta": "微信小程序开发demo,地图导航、marker标注", 80 | "description": "微信小程序开发demo,地图导航、marker标注", 81 | "demoUrl": "", 82 | "gitUrl": "https://github.com/giscafer/wechat-weapp-mapdemo" 83 | }, 84 | { 85 | "type": [ 86 | "all", 87 | "angular" 88 | ], 89 | "img": "formbuilder", 90 | "title": "ngx-form-builder", 91 | "subtitle": "jsonSchema 表单自动化构建,支持模板代码在线编辑、复制、下载", 92 | "meta": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 93 | "description": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 94 | "demoUrl": "http://form.giscafer.com", 95 | "gitUrl": "https://github.com/giscafer/ngx-form-builder" 96 | }, 97 | { 98 | "type": [ 99 | "all", 100 | "angular", 101 | "nodejs" 102 | ], 103 | "img": "angular", 104 | "title": "angular-chat", 105 | "subtitle": "Angular4 • Node.js • Socket.io", 106 | "meta": "(IM App)Chat App built using Angular and Socket.io", 107 | "description": "(IM App)Chat App built using Angular and Socket.io,模仿百度E秘聊天", 108 | "demoUrl": "http://project.xinong.wang:8080/", 109 | "gitUrl": "https://github.com/giscafer/angular-chat" 110 | }, 111 | { 112 | "type": [ 113 | "all", 114 | "react" 115 | ], 116 | "img": "react", 117 | "title": "ife-course-demo", 118 | "subtitle": "react", 119 | "meta": "百度前端技术学院demo演示SPA ", 120 | "description": "百度前端技术学院demo演示SPA ", 121 | "demoUrl": "http://ife.giscafer.com", 122 | "gitUrl": "https://github.com/giscafer/ife-course-demo" 123 | }, 124 | { 125 | "type": [ 126 | "all", 127 | "angular" 128 | ], 129 | "img": "angular", 130 | "title": "ng2-ife-course", 131 | "subtitle": "angular2", 132 | "meta": "百度前端技术学院demo演示SPA ", 133 | "description": "百度前端技术学院demo演示SPA ", 134 | "demoUrl": "http://ng2ife.giscafer.com", 135 | "gitUrl": "https://github.com/giscafer/ng2-ife-course" 136 | }, 137 | { 138 | "type": [ 139 | "all", 140 | "nodejs" 141 | ], 142 | "img": "10", 143 | "title": "moviesite", 144 | "subtitle": "Node.js • Jade • MongoDB", 145 | "meta": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,网站爬虫添加,电影查询删除等", 146 | "description": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,爬虫添加电影,电影查询删除等", 147 | "demoUrl": "", 148 | "gitUrl": "https://github.com/giscafer/moviesite" 149 | }, 150 | { 151 | "type": [ 152 | "all", 153 | "other", 154 | "wechat", 155 | "java" 156 | ], 157 | "img": "11", 158 | "title": "gisrobot", 159 | "subtitle": "Java • 微信公众号", 160 | "meta": " 微信公众号JAVA开发学习demo,天气预报查询、消息自动回复、中英文翻译", 161 | "description": "微信公众号开发机器人,天气预报查询、消息自动回复、中英文翻译", 162 | "demoUrl": "", 163 | "gitUrl": "https://github.com/giscafer/gisrobot" 164 | }, 165 | { 166 | "type": [ 167 | "all", 168 | "react" 169 | ], 170 | "img": "react", 171 | "title": "react-demo-list", 172 | "subtitle": "react", 173 | "meta": " react学习练习demo", 174 | "description": " react学习练习demo", 175 | "demoUrl": "https://giscafer.github.io/react-demo-list/", 176 | "gitUrl": "https://github.com/giscafer/react-demo-list" 177 | }, 178 | { 179 | "type": [ 180 | "all", 181 | "vue", 182 | "nodejs" 183 | ], 184 | "img": "vue", 185 | "title": "Vue-order", 186 | "subtitle": "vue.js1.x • Node.js • MongoDB", 187 | "meta": " nodejs+vue.js学习开发demo,订餐系统应用 ", 188 | "description": "nodejs+vue.js学习开发demo,订餐系统应用", 189 | "demoUrl": "", 190 | "gitUrl": "https://github.com/giscafer/Vue-order" 191 | }, 192 | { 193 | "type": [ 194 | "all", 195 | "nodejs", 196 | "npm" 197 | ], 198 | "img": "3", 199 | "title": "alidayujs", 200 | "subtitle": "NPM • Node.js", 201 | "meta": "阿里大鱼短信SDK( JavaScript Alidayu SDK)封装成npm插件", 202 | "description": "JavaScript Alidayu SDK 兼容服务器端环境node.js,模块加载器如RequireJS和所有浏览器", 203 | "npm": "https://www.npmjs.com/package/alidayujs", 204 | "demoUrl": "", 205 | "gitUrl": "https://github.com/giscafer/alidayujs" 206 | }, 207 | { 208 | "type": [ 209 | "all", 210 | "nodejs", 211 | "npm" 212 | ], 213 | "img": "3", 214 | "title": "node-ipcity", 215 | "subtitle": "NPM • Node.js", 216 | "meta": "Get ip city info 获取ip归属城市信息 | NPM插件", 217 | "description": "get ip city info 获取ip归属城市信息", 218 | "npm": "https://www.npmjs.com/package/node-ipcity", 219 | "demoUrl": "", 220 | "gitUrl": "https://github.com/giscafer/node-ipcity" 221 | }, 222 | { 223 | "type": [ 224 | "all", 225 | "nodejs", 226 | "npm" 227 | ], 228 | "img": "3", 229 | "title": "node-typhoon", 230 | "subtitle": "NPM • Node.js", 231 | "meta": "Help you get the typhoon information 台风信息查询Api | NPM插件", 232 | "description": "Help you get the typhoon information 台风信息查询Api", 233 | "npm": "https://www.npmjs.com/package/node-typhoon", 234 | "demoUrl": "", 235 | "gitUrl": "https://github.com/giscafer/node-typhoon" 236 | }, 237 | { 238 | "type": [ 239 | "all", 240 | "nodejs", 241 | "angular" 242 | ], 243 | "img": "5", 244 | "title": "git-batch-file-builder", 245 | "subtitle": "angular1.x • Git • Node.js", 246 | "meta": "Git Batch File Builder,git批处理文件创建", 247 | "description": "Git Batch File Builder,git批处理文件创建", 248 | "demoUrl": "", 249 | "gitUrl": "https://github.com/giscafer/git-batch-file-builder" 250 | }, 251 | { 252 | "type": [ 253 | "all", 254 | "nodejs", 255 | "other" 256 | ], 257 | "img": "6", 258 | "title": "generate-form-by-table-structure", 259 | "subtitle": "Node.js", 260 | "meta": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 261 | "description": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 262 | "demoUrl": "", 263 | "gitUrl": "https://github.com/giscafer/generate-form-by-table-structure" 264 | }, 265 | { 266 | "type": [ 267 | "all", 268 | "other", 269 | "java" 270 | ], 271 | "img": "7", 272 | "title": "physicaltable", 273 | "subtitle": "Java • BootStrap", 274 | "meta": "一个关于体育成绩登记的简单站点", 275 | "description": "一个关于体育成绩登记的简单站点", 276 | "demoUrl": "", 277 | "gitUrl": "https://github.com/giscafer/physicaltable" 278 | }, 279 | { 280 | "type": [ 281 | "all", 282 | "angular" 283 | ], 284 | "img": "angular", 285 | "title": "angular-webuploader", 286 | "subtitle": "angular1.x • webuploader", 287 | "meta": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 288 | "description": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 289 | "demoUrl": "", 290 | "gitUrl": "https://github.com/giscafer/angular-webuploader" 291 | }, 292 | { 293 | "type": [ 294 | "all", 295 | "angular" 296 | ], 297 | "img": "angular", 298 | "title": "laoui-bootstrap", 299 | "subtitle": "angular1.x • bootstrap", 300 | "meta": "基于bootstrap与angularjs1.x的UI组件封装", 301 | "description": "基于bootstrap与angularjs1.x的UI组件", 302 | "demoUrl": "http://laoui.giscafer.com", 303 | "gitUrl": "" 304 | }, 305 | { 306 | "type": [ 307 | "all", 308 | "angular" 309 | ], 310 | "img": "angular", 311 | "title": "ng-ace-tern", 312 | "subtitle": "NPM • Angular", 313 | "meta": "Tern plugin for Ace Editor for Angular", 314 | "description": "Tern plugin for Ace Editor for Angular", 315 | "npm": "https://www.npmjs.com/package/ng-ace-tern", 316 | "demoUrl": "", 317 | "gitUrl": "https://github.com/giscafer/ng-ace-tern" 318 | }, 319 | { 320 | "type": [ 321 | "all", 322 | "angular" 323 | ], 324 | "img": "angular", 325 | "title": "ng-viewer", 326 | "subtitle": "Angular", 327 | "meta": "An angular directive for viewer.js", 328 | "description": "An angular directive for viewer.js", 329 | "demoUrl": "", 330 | "gitUrl": "https://github.com/giscafer/ng-viewer" 331 | }, 332 | { 333 | "type": [ 334 | "all", 335 | "angular" 336 | ], 337 | "img": "angular", 338 | "title": "primeng-ext", 339 | "subtitle": "Angular", 340 | "meta": "primeng component extension", 341 | "description": "primeng component extension", 342 | "demoUrl": "", 343 | "gitUrl": "https://github.com/giscafer/primeng-ext" 344 | }, 345 | { 346 | "type": [ 347 | "all", 348 | "app" 349 | ], 350 | "img": "gis520", 351 | "title": "GIS520", 352 | "subtitle": "php + H5", 353 | "meta": "大学时期创建GIS520论坛,开发的论坛H5 APP", 354 | "description": "大学时期创建GIS520论坛,开发的论坛H5 APP", 355 | "demoUrl": "http://sj.qq.com/myapp/detail.htm?apkName=com.gis520.www", 356 | "gitUrl": "" 357 | }, 358 | { 359 | "type": [ 360 | "all", 361 | "nodejs" 362 | ], 363 | "img": "3", 364 | "title": "wechat-autoreply", 365 | "subtitle": "wechat + node.js", 366 | "meta": "web 微信关键词自动回复功能(微信聊天,非公众号机器人)", 367 | "description": "web微信!!!非微信公众号,不管是在微信群聊还是微信私聊中,触发关键词,都会出现自动回复", 368 | "gitUrl": "https://github.com/giscafer/wechat-autoreply" 369 | }, 370 | { 371 | "type": [ 372 | "all", 373 | "course" 374 | ], 375 | "img": "live", 376 | "title": "从 giser 到前端开发经理之路", 377 | "subtitle": "学习和工作经验分享", 378 | "meta": "知乎Live", 379 | "description": "WebGIS 开发工程师入门、前端开发工程师入门的一些经验分享与见解,以及结合我的简历和工作经验", 380 | "pptUrl": "https://www.zhihu.com/lives/844909623906549760", 381 | "gitUrl": "" 382 | }, 383 | { 384 | "type": [ 385 | "all", 386 | "course" 387 | ], 388 | "img": "npm", 389 | "title": "node.js npm 模块开发与发布、Mocha自动化测试", 390 | "subtitle": "npm 模块开发培训", 391 | "meta": "线上直播讲堂", 392 | "description": "node.js npm 模块开发与发布、Mocha自动化测试", 393 | "pptUrl": "https://segmentfault.com/l/1500000011901133/", 394 | "gitUrl": "" 395 | }, 396 | { 397 | "type": [ 398 | "all", 399 | "course" 400 | ], 401 | "img": "pwa", 402 | "title": "PWA 技术分享", 403 | "subtitle": "PWA", 404 | "meta": "公司内部技术培训,PWA技术分享PPT&Demo", 405 | "description": "PWA技术学习分享", 406 | "pptUrl": "https://github.com/giscafer/PWA-demo/blob/master/PWA%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB.pptx", 407 | "gitUrl": "https://github.com/giscafer/PWA-demo" 408 | }, 409 | { 410 | "type": [ 411 | "all", 412 | "course" 413 | ], 414 | "img": "webcomponents", 415 | "title": "认识 Web Components", 416 | "subtitle": "Web Components", 417 | "meta": "公司内部前端组培训,Web Components 技术分享PPT&Demo", 418 | "description": "Web Components 技术学习分享", 419 | "pptUrl": "http://yanshuo.io/assets/player/?deck=5b3e1196fe88c20035d21968#/", 420 | "gitUrl": "https://github.com/giscafer/webcomponents-demo" 421 | }, 422 | { 423 | "type": [ 424 | "all", 425 | "course" 426 | ], 427 | "img": "graphql", 428 | "title": "探索 GraphQL", 429 | "subtitle": "GraphQL 技术分享", 430 | "meta": "公司内部技术培训,GraphQL 技术分享 PPT & Demo", 431 | "description": "GraphQL 技术学习分享", 432 | "pptUrl": "https://yanshuo.io/assets/player/?deck=5b65b580ee920a003be3eeb6#/", 433 | "gitUrl": "https://github.com/giscafer/Angular-GraphQL-Express-Demo" 434 | }, 435 | { 436 | "type": [ 437 | "all", 438 | "app" 439 | ], 440 | "img": "rn", 441 | "title": "react-native-apollo-example", 442 | "subtitle": "React Native + GraphQL", 443 | "meta": "A demo for study GraphQL & React Native (server&client)", 444 | "description": "React Native", 445 | "gitUrl": "https://github.com/giscafer/react-native-apollo-example" 446 | }, 447 | { 448 | "type": [ 449 | "all", 450 | "nodejs" 451 | ], 452 | "img": "2", 453 | "title": "orcword", 454 | "subtitle": "nodejs + baidu aip", 455 | "meta": "ORC 识别,支持pdf、图片、已及转word", 456 | "description": "ORC 识别,支持pdf、图片、已及转word", 457 | "gitUrl": "https://github.com/giscafer/orcword" 458 | }, 459 | { 460 | "type": [ 461 | "all", 462 | "angular" 463 | ], 464 | "img": "angular", 465 | "title": "ag-grid-angular-demo", 466 | "subtitle": "angular + ag-Grid + WebSocket + GraphQL", 467 | "meta": "demo list for ag-grid-angular,includes websocket/graphql data binding service", 468 | "description": "demo list for ag-grid-angular,includes websocket/graphql data binding service", 469 | "demoUrl": "http://blog.giscafer.com/ag-grid-angular-demo", 470 | "gitUrl": "https://github.com/giscafer/ag-grid-angular-demo" 471 | }, 472 | { 473 | "type": [ 474 | "all", 475 | "app" 476 | ], 477 | "img": "feweekly", 478 | "title": "前端小助手", 479 | "subtitle": "微信小程序", 480 | "meta": "前端早报、周刊、精选文章资源", 481 | "description": "前端早报、周刊、精选文章资源", 482 | "demoUrl": "https://user-images.githubusercontent.com/8676711/51069422-cee4f780-1669-11e9-937c-33055af05eef.jpg", 483 | "gitUrl": "https://user-images.githubusercontent.com/8676711/51069422-cee4f780-1669-11e9-937c-33055af05eef.jpg" 484 | }, 485 | { 486 | "type": [ 487 | "all", 488 | "course" 489 | ], 490 | "img": "vdom", 491 | "title": "深入认识 Virtual DOM", 492 | "subtitle": "Virtual DOM 技术分享", 493 | "meta": "公司内部技术分享 PPT", 494 | "description": "Virtual DOM 技术学习分享", 495 | "pptUrl": "https://slides.com/giscafer/deck/fullscreen", 496 | "gitUrl": "https://github.com/giscafer/front-end-manual/issues/24" 497 | }, 498 | { 499 | "type": [ 500 | "all", 501 | "course" 502 | ], 503 | "img": "feteam", 504 | "title": "前端团队工程化实践", 505 | "subtitle": "经验总结 技术分享", 506 | "meta": "开发流程规范、项目管理、组件化、前后端协助、CI/CD", 507 | "description": "开发流程规范、项目管理、组件化、前后端协助、CI/CD", 508 | "pptUrl": "https://slides.com/giscafer/deck-2/fullscreen", 509 | "gitUrl": "https://github.com/giscafer/front-end-manual/issues/26" 510 | } 511 | ] 512 | -------------------------------------------------------------------------------- /docs/diamond.454689b5ab7b8692c1f1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/diamond.454689b5ab7b8692c1f1.png -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/favicon.ico -------------------------------------------------------------------------------- /docs/gis520.0be815c44cd71c57af6a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/gis520.0be815c44cd71c57af6a.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | ProjectFork me on GitHub
-------------------------------------------------------------------------------- /docs/inline.0420f7c5bc23f160806d.bundle.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var u,i,f,l=0,s=[];l 11 |
12 |

Panel title

13 |
14 |
15 | Panel content 16 |
17 | 18 | 19 | panel-heading, 20 | panel-body, 21 | panel-footer all could be select use not necessary 22 | */.bordered{border-bottom:1px solid #d0d6d9}.panel{-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);padding:0 20px;color:#14191e;background-color:#fff;margin-bottom:20px}.panel-heading{border-bottom:1px solid #d0d6d9}.panel-title{height:50px;line-height:50px;font-size:16px} 23 | /*翻页*/.rl-modal .ipt{border:1px solid #d0d6d9}.rlf-tip-error{color:#f01400}.rl-modal .replay-refresh-veify{color:#b5b9bc;font-size:24px;display:inline-block;margin:8px 0 0 10px;-webkit-transition:.4s linear;-webkit-transition:.4s ease-in;transition:.4s ease-in}.rl-modal .replay-refresh-veify:hover{color:#787d82;transform:rotate(1turn);-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-o-transform:rotate(1turn);-ms-transform:rotate(1turn)}.rl-modal .btn-red{color:#fff} 24 | /*down inputs*/.autoul{top:40px}.mr60{margin-right:60px}.pa{position:absolute}.color-red{color:#ef1300!important}.rl-modal{position:fixed;background:#fff;z-index:100000;width:360px;padding-bottom:30px;left:50%;top:50%;margin:-218px 0 0 -180px;-webkit-box-shadow:0 0 3px rgba(0,0,0,.25);box-shadow:0 0 3px rgba(0,0,0,.25);transition:all .2s;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s}.rl-modal.in{opacity:1;filter:alpha(opacity=100)}.rl-modal-header{position:relative;padding:0 20px}.rl-modal-header h1{font-size:16px;line-height:49px;height:49px;color:#787d82;border-bottom:1px solid #d0d6d9}.rl-modal-header h1 span{float:left;width:80px;text-align:center;height:49px;line-height:49px;cursor:pointer}.rl-modal-header .active-title,.rl-modal-header span:hover{border-bottom:1px solid #f01400;color:#f01400}.rl-close{position:absolute;top:17px;right:20px;width:17px;height:17px;cursor:pointer;background:url(/static/module/common/img/nlogin.png) no-repeat 0 0;-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s;-webkit-transition:transform .2s;-moz-transition:transform .2s;-o-transition:transform .2s}.rl-close:hover{background-position:0 -21px;transform:scale(1.1);-webkit-transform:scale(1.1);-moz-transform:scale(1.1)}.rl-modal-body{padding:0 30px}.error-erea{font-size:14px;color:#f01400;padding-bottom:5px;height:20px}.modal-backdrop{background-color:#fff}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.75;filter:alpha(opacity=75)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.rl-model-footer{padding:20px 30px 4px}.rlf-appendix{line-height:1em;margin-bottom:20px}.rlf-appendix .rlf-autoin,.rlf-appendix .rlf-forget{color:#787d82}.rlf-appendix .rlf-forget:hover{color:#f01400}.rlf-appendix .auto-cbx{margin-right:10px;vertical-align:-1px}.rl-modal .ipt{width:279px;padding:9px 9px 9px 10px;background-color:#fff;border-color:#d0d6d9;-webkit-box-shadow:2px 0 5px 0 #fff;box-shadow:2px 0 5px 0 #fff}.rl-modal .ipt:focus{border-color:#98a1a6}.ipt-email{background-position:0 0}.ipt-pwd{background-position:0 -48px}.ipt-nick{background-position:0 -96px}.rlf-verify-group .rlf-input{background:#fff;padding-left:7px;width:120px;vertical-align:top}.rlf-verify-group img{height:38px;width:70px;margin:0 10px;vertical-align:top;display:inline-block}.rlf-verify-group span{display:inline-block;color:#39b94e;cursor:pointer;height:40px;vertical-align:top;line-height:150%;margin-top:-4px}.rlf-tip-wrap{font-size:12px;height:20px;line-height:20px}.rlf-g-tip{height:20px}.rlf-tip-globle{font-size:14px;height:30px;line-height:30px}.rlf-tip-error{color:#c00}.btn-full{width:300px;height:50px;line-height:50px;font-size:16px;font-family:Microsoft Yahei,Hiragino Sans GB,Helvetica,Helvetica Neue,微软雅黑,Tahoma,Arial,sans-serif}.btn-block{display:block;width:auto}.forgetpwd-resultwrap{text-align:center;display:none;width:260px}.pop-login-sns{text-align:center;font-size:14px}.pop-login-sns span{color:#b5b9bc;display:inline-block;margin-top:4px}.pop-login-sns a{font-size:14px;margin-left:21px;height:20px;line-height:20px;color:#c8cdd2}.pop-login-sns a,.pop-login-sns i{-webkit-transition:color .2s;transition:color .2s}.pop-login-sns i{font-size:29px;vertical-align:-3px;color:#b5b9bc}.pop-login-sns .pop-sns-weixin:hover i{color:#00b33b}.pop-login-sns .pop-sns-qq:hover i{color:#08c}.pop-login-sns .pop-sns-weibo:hover i{color:#f01400}.rl-modal .ipt-verify{margin-right:10px;width:120px;padding-left:9px;background-image:none}.rl-modal .icon-refresh{color:#b5b9bc;font-size:24px;display:inline-block;margin:8px 0 0 10px;-webkit-transition:.4s linear;-webkit-transition:.4s ease-in;transition:.4s ease-in}.rl-modal .icon-refresh:hover{color:#787d82;transform:rotate(1turn);-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-o-transform:rotate(1turn);-ms-transform:rotate(1turn)}.rl-modal{ 25 | /*.ipt{ 26 | .placeholder(@color-gray); 27 | }*/ 28 | /* don't show the x for text inputs */ 29 | /* don't show the eye for password inputs */}.rl-modal .proclaim-loc{position:relative}.rl-modal .proclaim-btn{font-size:23px;color:#b5b9bc;position:absolute;top:8px;right:8px}.rl-modal .proclaim-btn:hover{color:#787d82}.rl-modal .verify-img{width:70px;height:40px;vertical-align:top}.rl-modal .verify-extra{line-height:20px}.rl-modal .verify-extra a{color:#00b33b}.rl-modal .btn-red{background-color:#f01400;border-color:#f01400}.rl-modal .btn-red:hover{background-color:#ff6464;border-color:#ff6464}.rl-modal .ipt-error,.rl-modal .rlf-tip-error{color:#f01400}.rl-modal .rlf-tip-error{height:30px;line-height:30px}.rl-modal .js-proclaim-on .js-txt-pwd{display:none}.rl-modal .js-proclaim-off .js-pass-pwd{display:none!important}.rl-modal input[type=password]::-ms-reveal,.rl-modal input[type=text]::-ms-clear{width:0;height:0}.verify-img-wrap{float:left;height:40px;width:70px}.rlf-tip-wrap{clear:both} 30 | /*down inputs*/.autoul{width:298px;padding:0;border:1px solid #98a1a6;border-top:0 none;position:absolute;height:156px;overflow:hidden;background-color:#fff;z-index:10000}.autoul .autoli{color:#787d82;height:39px;line-height:39px;text-align:left;cursor:pointer;font-size:14px;padding:0 10px;overflow:hidden;display:none;text-overflow:ellipsis}.autoul .lihover{background-color:#edf1f2}.autoul .showli{display:block}.form-control .autoul{width:318px}.erweima{background:url(/static/module/common/img/erweima.png) no-repeat 0 0}.erweima,.pcLogin{width:60px;height:60px;position:absolute;bottom:0;right:0;cursor:pointer}.pcLogin{background:url(/static/module/common/img/pcLogin.png) no-repeat 0 0}.qrcode{margin:50px 70px 20px 70px;position:relative}.qrcode_title{color:#13181e;font-family:微软雅黑;font-size:18px;text-align:center}.qrcode_mark{color:#777d81;font-size:14px;text-align:center}.qrcode-inner{position:absolute;background-color:#fff;height:150px;width:150px;opacity:.95}.qrcode_state_scaned{background:url(/static/module/common/img/scaned.png) no-repeat 0 0;width:100%;height:100%;position:absolute;left:45px;top:40px}.qrcode_state_validate{background:url(/static/module/common/img/code_validate.png) no-repeat 0 0;width:100%;height:100%;position:absolute;left:28px;top:42px}.phoneVerityBox{font-family:微软雅黑}.backNotify,.phoneVerityBox .subtitle,.phoneVerityBox .title{text-align:center}.phoneVerityBox .title{margin-top:27px;margin-bottom:12px;color:#13181e;font-size:18px;font-family:微软雅黑}.phoneVerityBox .rlf-tip-wrap{height:30px;line-height:30px}.phoneVerityBox .subtitle{color:#777c81;font-size:14px;margin-bottom:25px;font-family:微软雅黑}.phoneVerityBox .reSend{color:#b4b8bb;top:10px;right:15px;border-left:1px solid #b4b8bb;padding-left:12px}.rl-modal-body .backNotify{color:#777c81;margin-top:15px;cursor:pointer}.rl-modal-body .user_header{width:76px;background:url(/static/module/common/img/default_user.png) no-repeat 0 0;height:76px;margin:auto;margin-top:40px}.rl-modal-body .btn-finished{width:160px;height:50px}.rl-modal-body .finished_wrap{text-align:center}.rl-modal-body .active{color:#13181e!important;cursor:pointer}.rl-modal-body .active:hover{color:#ff6464!important}@media screen and (max-width:480px){.rl-modal{margin:-218px 0 0 -150px;width:300px}.rl-modal .ipt{width:249px;font-size:12px}.rl-modal-body,.rl-modal-header{padding:0 15px}.btn-full{width:260px}.rl-model-footer{padding:20px 15px 4px}.rl-model-footer .mr60{margin-right:0}}.ueword{word-break:break-all}.ueword caption,.ueword code,.ueword optgroup,.ueword strong,.ueword th{font-style:inherit;font-weight:700}.ueword address,.ueword cite,.ueword dfn,.ueword em,.ueword i,.ueword var{font-style:italic;font-weight:inherit}.ueword blockquote{padding:1px 20px;margin:1em 0;border-left:4px solid #ccc;color:#787d82;background-color:#f5f5f5}.ueword blockquote p{line-height:1.5em;font-size:13px;color:#444}.ueword ul{list-style-type:disc}.ueword ol{list-style-type:decimal}.ueword .list-paddingleft-2{padding-left:30px}.ueword a{color:#08c;text-decoration:none}.ueword a:hover{color:#08c;text-decoration:underline}.ueword pre{margin:.5em 0;padding:.4em .6em;line-height:1.5;border-radius:3px;background:#eee;overflow-x:auto}.pad9,.w298{padding:0 9px}.w298{width:278px}.w200{width:180px;padding:0 9px}.statement{margin-bottom:12px}#improve-mode{width:430px;-webkit-box-sizing:border-box;box-sizing:border-box}.moco-modal-layer #improve-mode{display:block!important}.improve .wfbd{position:absolute;_left:230px;left:330px;bottom:48px;font-size:12px;color:#727679}.improve .wfbd:hover{text-decoration:underline}.improve label{display:inline-block;width:104px;font-weight:700;color:#07111b;text-align:right}.improve .help-inline{left:120px;width:298px;position:absolute;line-height:24px;bottom:-24px;font-size:12px;color:#f01414}.improve .help-inline label.error{color:inherit;text-align:left;font-weight:400;width:auto}.improve .help-inline i{display:inline-block;color:#fff;width:20px;background:#00a0dc;border-radius:2px;cursor:pointer;font-style:normal;text-align:center}.improve .box{line-height:36px;position:relative;margin-bottom:8px}.improve .box input[type=password],.improve .box input[type=text]{border:1px solid #d9dde1;height:36px;margin-left:16px}.improve .box .getCode{position:absolute;padding:0 9px;top:1px;right:0;color:#00a0dc}.improve .box .getCode:hover{color:#008cc8}.improve .box a.sending{color:#b7bbbf!important}.improve .box .l{position:relative}.improve .box .l .icon-pw{position:absolute;top:0;right:0;color:#b7bbbf;line-height:38px;font-size:24px;margin-right:7px}.improve .box .l .icon-pw:hover{color:#71777d}.improve .box .cancelBtn,.improve .box .submitBtn{display:inline-block;text-align:center}.improve .box .submitBtn{width:60px;height:36px;color:#fff;background-color:#00a0dc;margin-left:120px;vertical-align:top}.improve .box .submitBtn:hover{color:#fff}.improve .box .cancelBtn{width:86px;height:34px;border:1px solid #b7bbbf;color:#4d555d;margin-left:12px}.improve .edit{margin-bottom:24px}.improve .edit p.w298{margin:10px 0 30px 111px;font-size:12px;color:#93999f;line-height:22px}.improve .info-val{margin-left:16px;color:#07111b}.certificate-mode{display:none}.first-certificate{display:block}#certificate-mode{position:fixed;left:50%;top:50%;width:408px;height:468px;margin-left:-204px;margin-top:-234px;z-index:10}#certificate-mode .certificate-wrap{display:block;position:absolute;left:0;top:0;bottom:0;right:0;background-image:url(/static/module/common/img/certificate.png)}#certificate-mode .certificate-cont{position:absolute;top:174px;left:0;right:0;text-align:center}#certificate-mode h5{font-size:12px;line-height:14px;margin-bottom:14px;color:#07111b}#certificate-mode h2{margin-bottom:20px;font-weight:700}#certificate-mode h2 a{line-height:22px;color:#3261a7;font-size:20px}#certificate-mode p{font-size:12px;line-height:14px;color:#07111b}#certificate-mode h3{font-size:16px;line-height:24px;margin:14px 0;width:80%;margin-left:auto;margin-right:auto}#certificate-mode h3 a{color:#3261a7}#certificate-mode .generate-report-mode{position:absolute;left:0;right:0;bottom:-50px;text-align:center}#certificate-mode .generate-report-mode .generate-report{display:inline-block;border:1px solid #fff;padding:4px 8px;height:24px;line-height:24px;font-size:14px;text-align:center;color:#fff}.certificate-mode-opt{position:fixed;left:0;right:0;top:0;bottom:0;z-index:9;background:rgba(7,17,27,.5)}#main,.body-main{min-height:750px}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pr{position:relative} 31 | /*=header 32 | //todo:可分离单独文件*/#header{background:#000}#nav{width:auto;padding-right:20px;height:60px;margin:0 auto;position:relative}.logo{float:left}#logo{margin:0 20px}#logo a,.logo a{display:block;height:60px;width:140px;background:url(/static/module/common/img/logo.png?t=2.3) no-repeat 50%;text-indent:100%;white-space:nowrap;overflow:hidden}.logo a{-webkit-transition:background-color .2s;transition:background-color .2s}.logo a:hover{background-color:#363c41}.set_btn{right:0}.set_btn a.hover{background-color:#363d40}.set_btn img{width:36px;height:36px;border-radius:50%;vertical-align:middle;display:inline-block}.nav-item li{float:left}.nav-item a{position:relative;padding:0 25px;display:block;color:#fff;text-align:center;font-size:14px;height:60px;line-height:60px;-webkit-transition:background-color .3s;transition:background-color .3s}.nav-item a .icn-new{position:relative;display:inline-block;*display:inline;*zoom:1;top:-10px;width:16px;height:16px;background:url(/static/module/common/img/new.png) no-repeat 0 0}.nav-item .active a,.nav-item a.active,.nav-item a:hover{color:#fff;background-color:rgba(77,85,93,.4)}.header-app{position:relative}.header-app:hover .QR-download{display:block}.header-app:hover .icon-appdownload{color:#fff}.header-app a{font-size:22px;display:block;width:60px;text-align:center;height:60px;line-height:60px;color:#787d82;-webkit-transition:background-color .2s;transition:background-color .2s}.header-app a:hover{color:#fff;background-color:#363c41}.header-app .QR-download{display:none;position:absolute;top:72px;left:-57px;width:140px;height:166px;background:#fff;padding:16px 20px 18px 20px;text-align:center;webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);z-index:9999}.header-app .QR-download #app-text{margin:0;height:0;color:#14191e;font:700 14px/15px 微软雅黑;height:15px}.header-app .QR-download #app-type{margin:0;height:0;color:#787d82;font:12px/20px 微软雅黑;height:30px}.header-app .QR-download:before{content:" ";display:block;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #fff;position:absolute;top:-8px;left:79px}.header-app-icon{display:inline-block;width:11px;height:16px;background:url(/static/module/common/img/head-app-icon.png) no-repeat 0 0;vertical-align:-3px;margin-right:5px;transition:.3s;-moz-transition:.3s;-webkit-transition:.3s;-o-transition:.3s}#header .app-down-area a{display:block;padding:0 8px;height:60px;line-height:60px;color:#656e73}#header .app-down-area a:hover{color:#fff;background-color:#363c41}#header .app-down-area a:hover i{background-position:0 -16px} 33 | /*全局搜索*/.search-warp{float:right;position:relative;margin-right:18px}.search-warp i{display:block;width:30px;height:60px;color:#757a7e;font-size:22px;line-height:60px;cursor:pointer}.search-warp i:hover{color:#fff}.search-warp .showhide-search{width:30px;height:60px;line-height:60px;text-align:right;position:absolute;display:inline-block;right:0;top:0}.search-warp .searchTags{display:none;z-index:100;left:0;top:16px}.search-warp .searchTags a{margin-right:5px;padding:5px 8px;color:#93999f;background-color:#2b333b}.search-area{float:right;position:relative;height:38px;width:210px;margin:10px 0;padding-right:30px;border:1px solid #000;border-bottom-color:hsla(210,4%,49%,.8);zoom:1;-webkit-transition:width .3s;transition:width .3s}.search-area.min{width:0;border-color:#000}.search-area .search-input{padding:5px 10px;width:100%;height:38px;line-height:38px;font-size:12px;float:left;border:0;color:#fff;-webkit-transition:background-color .3s;transition:background-color .3s;background-color:#000;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.search-area .search-input:-moz-placeholder{color:#787d82}.search-area .search-input::-moz-placeholder{color:#787d82;opacity:1}.search-area .search-input:-ms-input-placeholder{color:#787d82}.search-area .search-input::-webkit-input-placeholder{color:#787d82}.search-area .search-input.placeholder{color:#787d82}.search-area .btn_search{float:left;cursor:pointer;width:30px;height:38px;text-align:center;-webkit-transition:background-color .3s;transition:background-color .3s}.search-area .search-area-result{position:absolute;left:0;top:41px;width:238px;margin-bottom:20px;border:1px solid #d3d3d3;border-top:none;background-color:#fff;-webkit-box-shadow:0 4px 8px rgba(0,0,0,.35);box-shadow:0 4px 8px rgba(0,0,0,.35);font-size:12px;overflow:hidden;display:none;z-index:1000}.search-area .search-area-result li{height:40px;line-height:40px;padding:0 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#787d82;cursor:pointer}.search-area .search-area-result .light,.search-area .search-area-result li:hover{color:#14191e;background-color:#edf0f2}#login-area{float:right;position:relative}.header-unlogin li{float:left}.header-signin a,.header-signup a{display:block;width:60px;font-size:14px;text-align:center;height:60px;line-height:60px;color:#787d82;-webkit-transition:background-color .2s;transition:background-color .2s}.header-signin a:hover{color:#fff;background-color:#f01400}.header-signup a:hover{color:#fff;background-color:rgba(77,85,93,.4)}.logined>li{float:left;position:relative}.logined li>a{display:block;height:60px;line-height:60px;width:60px;color:#787d82;text-align:center;-webkit-transition:background-color .2s;transition:background-color .2s}.logined li>a:hover{color:#fff;background-color:rgba(77,85,93,.4)}.logined li>a>i{font-size:22px;line-height:60px;text-align:center;cursor:pointer}.logined li .msg_icon{display:none;position:absolute;padding:0 4px;height:16px;left:32px;top:10px;line-height:14px;background:#c9394a;border-radius:2px;color:#fff;font-style:normal;font-size:10px}.remind_warp{width:60px;height:60px;position:relative}.remind_warp .msg_remind{display:none;position:absolute;width:8px;height:8px;background-color:#f01414;right:14px;top:14px;border-radius:50%}.remind_warp .sz-notifi{display:block;-webkit-transition:color .2s;transition:color .2s}.remind_warp .sz-notifi:hover{color:#fff!important;background-color:#363c41}#nav_list{display:none;z-index:999;width:140px;position:absolute;top:60px;right:0;background:#363c41;list-style:none}#nav_list li a{border-top:1px solid #4a5153;height:39px;line-height:39px;font-size:14px;background-image:url(/static/module/common/img/menu_icon.png?t=10);background-repeat:no-repeat;display:block;color:#fff;text-align:left;padding:0;padding-left:47px;width:auto}#nav_list a:hover{color:#fff;background-color:#4d5559}#nav_list #my_space{padding:0 18px;background-image:none;border:0;height:49px;line-height:49px;text-align:center}.my_message .msg_remind{display:none;position:absolute;width:6px;height:6px;background-color:#f01414;right:14px;top:14px;border-radius:50%}#nav_list .my_message{background-position:19px -46px}#nav_list #my_note{background-position:19px -90px}#nav_list #my_question{background-position:19px -128px}#nav_list #my_setting{background-position:19px -167px}#nav_list #my_logout{background-position:19px -207px}.myspace_remind{width:10px;height:10px;background:url(/static/module/common/img/space-remind.png) no-repeat 0 0;position:absolute;top:10px;right:10px} 34 | /*footer*/#footer{background:#000;border-top:1px solid #e2e4e6;font-size:12px;color:#787d82;padding:27px 0;min-width:620px;margin-top:60px}#footer .waper{width:auto;max-width:1200px;margin:0 auto}#footer .footer_intro{padding-left:40px}#footer p{line-height:1.7}.footer_logo{display:none;float:left;background:url(/static/module/common/img/footer-sprite.png) 0 -230px no-repeat;height:40px;width:120px;margin:0 20px}#footer .des{width:445px}#footer .followus{margin-right:34px;padding-left:30px;z-index:3}.followus a{float:left;position:relative;width:32px;height:32px;background-image:url(/static/module/common/img/footer-sprite.png);background-repeat:no-repeat;margin:3px 6px 0;opacity:.5;filter:alpha(opacity=50);-webkit-transition:opacity .2s;transition:opacity .2s}#footer .followus a:hover{opacity:1;filter:alpha(opacity=100)}.flw-weixin-box{position:absolute;display:none;width:170px;height:220px;left:-69px;bottom:35px;background:url(/static/module/common/img/footer-sprite.png?1) no-repeat 0 0;z-index:3}.followus .followus-weixin{background-position:0 -279px}.followus-weixin:hover .flw-weixin-box{display:block}.followus .followus-weibo{background-position:0 -321px}.followus .followus-qzone{background-position:0 -363px}.friend-links{ 35 | /*padding-top: 20px ;border-top:1px solid #4F5153;*/line-height:60px}.friend-links a{display:inline-block;margin-right:20px}.friend-links a:hover{text-decoration:underline;color:#000}.friend-links dl{padding:0 10px}.friend-links dd{float:left;width:160px}.footer_link ul{overflow:hidden;margin-top:-1px}.footer_link a:active,.footer_link a:link,.footer_link a:visited{color:#c8cdd2}.footer_link a:hover{color:#fff}#footer .footer_link{margin-bottom:4px;line-height:1.8}#footer .footer_link li{margin-right:30px;text-align:center;float:left}.user-card-box.hover .g-user-card{visibility:visible}.user-card-box:hover .g-user-card{ 36 | /* opacity: 1; 37 | filter: alpha(opacity=100); 38 | transform: rotateY(0) rotateX(0); */}.user-card-box:hover .user-card-item{background-color:rgba(77,85,93,.4)}.user-card-box .user-card-item img{width:36px;height:36px;border-color:#4d5559;margin-top:-5px} 39 | /* 顶部导航用户卡片 */.g-user-card{position:absolute;right:0;top:100%;width:306px;visibility:hidden;-webkit-box-shadow:0 4px 8px 0 rgba(7,17,27,.2);box-shadow:0 4px 8px 0 rgba(7,17,27,.2);z-index:1000}.g-user-card .card-inner{background-color:#fff;-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.2);box-shadow:0 4px 8px 0 rgba(0,0,0,.2);padding:24px;-webkit-box-sizing:border-box;box-sizing:border-box}.g-user-card .card-arr{position:absolute;right:23px;top:2px;border-width:0 7px 8px 7px;border-color:transparent transparent #f01400 transparent;border-style:solid}.g-user-card .card-top{color:#93999f;position:relative}.g-user-card .card-top img{float:left;width:72px;height:72px;border-radius:50%;border:2px solid #fff;margin-right:12px}.g-user-card .card-top .name{display:inline-block;font-size:16px;color:#07111b;width:170px;line-height:20px}.g-user-card .card-top a{color:#93999f;display:inline-block}.g-user-card .card-top .setup{position:absolute;right:20px;top:33px;opacity:.6;filter:alpha(opacity=60);font-size:16px}.g-user-card .card-top .setup:hover{opacity:1;filter:alpha(opacity=100)}.g-user-card .card-top .card-top-right-box{margin-top:14px}.g-user-card .card-top .meta{font-size:12px!important;line-height:12px}.g-user-card .card-top .meta a{margin-right:12px}.g-user-card .card-top .meta b{margin-left:2px}.g-user-card .user-center-box{margin-top:16px;margin-bottom:14px}.g-user-card .user-center-box ul li{position:relative;width:128px;width:127px\9; 40 | /*IE6,7,8 hack*/height:36px;background:#f3f5f7;line-height:36px;color:#4d555d;font-size:12px;margin-right:2px;margin-bottom:2px;-webkit-box-sizing:border-box;box-sizing:border-box}.g-user-card .user-center-box ul li .user-center-icon{position:relative;top:3px;font-size:16px;margin-right:8px}.g-user-card .user-center-box ul li a{width:100%;height:36px;line-height:36px;padding-left:12px;text-align:left;-webkit-box-sizing:border-box;box-sizing:border-box}.g-user-card .user-center-box ul li:hover,.g-user-card .user-center-box ul li:hover a{color:#4d555d;background:#d9dde1}.g-user-card .user-center-box ul li i{display:none;width:18px;height:18px;position:absolute;top:0;right:8px;background:url(/static/module/common/img/coupon-icon.png) no-repeat}.g-user-card .user-center-box ul li:nth-child(2n){margin-right:0}.g-user-card .linkToMall{position:absolute;right:24px;top:22px;opacity:.6;filter:alpha(opacity=60);font-size:12px;color:#fff}.g-user-card .linkToMall:hover{opacity:1;filter:alpha(opacity=100)}.g-user-card .card-history{padding-bottom:16px;margin-bottom:-1px;border-bottom:1px solid #edf1f2}.g-user-card .card-history .history-item{display:block;position:relative;padding-left:24px;font-size:12px;color:#787d82;-webkit-transition:background-color .2s;transition:background-color .2s;line-height:20px}.g-user-card .card-history .history-item .tit{display:block;margin-bottom:8px;font-weight:700}.g-user-card .card-history .history-item .media-name{display:block;width:200px}.g-user-card .card-history .history-item .imv2-history{position:absolute;left:0;top:2px;font-size:16px;font-weight:700}.g-user-card .card-history .history-item .continue{position:absolute;right:0;top:25px;color:#00b43c}.g-user-card .card-history .history-item .continue:hover{color:#00c850}.g-user-card .card-sets{margin-top:16px;font-size:12px;line-height:12px}.g-user-card .card-sets a{color:#4d555d}.g-user-card .card-sets a:hover{color:#f01400;background:none}.verify-box{height:36px;position:relative}.verify-box,.verify-box *{-webkit-box-sizing:border-box;box-sizing:border-box}.verify-box input[type=text]{border:1px solid #b7bbbf;width:118px;height:36px;margin-right:8px;line-height:36px;padding:0 10px;float:left}.verify-box .codeimg{cursor:pointer;width:70px;height:36px;background-color:#ffefdb;margin-right:12px;float:left;border:none}.verify-box i.imv2-refresh{cursor:pointer;font-size:24px;color:#93999f;float:left;line-height:36px;-webkit-transition:all .3s linear;transition:all .3s linear}.verify-box i.imv2-refresh:hover{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.verify-box .errtip{position:absolute;height:24px;line-height:24px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 5px;color:#f01414;font-size:12px;top:36px;visibility:visible} 41 | /*回到顶部*/.elevator{position:fixed;padding:0 15px;top:50%;right:0;margin-top:-140px;z-index:9;background-color:#fff;-webkit-box-shadow:-2px 2px 5px 3px rgba(7,17,27,.1);box-shadow:-2px 2px 5px 3px rgba(7,17,27,.1)}.elevator a{display:block;width:30px;padding:16px 0;font-size:22px;line-height:20px;color:#b5b9bc;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;border-bottom:1px solid #edf1f2}.elevator a:hover{color:#14191e}.elevator a i{font-size:24px;color:#b5b9bc}.elevator a i:hover{color:#14191e}.elevator a span{ 42 | /*display: none;*/font-size:12px;color:#333;line-height:12px}.elevator a .elevator-num{background-color:#f01414;color:#fff;border-radius:50%;text-align:center;font-size:12px;position:absolute;top:3px;width:18px;height:18px;line-height:16px;right:-9px} 43 | /*.elevator .elevator-msg:hover i, 44 | .elevator .elevator-faq:hover i, 45 | .elevator .elevator-app:hover i, 46 | .elevator .elevator-weixin:hover i, 47 | .elevator .elevator-top:hover i { 48 | display: none; 49 | } 50 | .elevator .elevator-msg:hover span, 51 | .elevator .elevator-faq:hover span, 52 | .elevator .elevator-app:hover span, 53 | .elevator .elevator-weixin:hover span, 54 | .elevator .elevator-top:hover span { 55 | display: inline-block; 56 | }*/ 57 | /*.elevator .elevator-app-box { 58 | position: absolute; 59 | width: 172px; 60 | height: 194px; 61 | bottom: -10px; 62 | right: 52px; 63 | -webkit-transition: opacity 0.25s, transform .3s; 64 | -moz-transition: opacity 0.25s, transform .3s; 65 | transition: opacity 0.25s, transform .3s; 66 | opacity: 0; 67 | filter: alpha(opacity=0); 68 | max-width: 0; 69 | -webkit-transform: scale(0.01); 70 | -ms-transform: scale(0.01); 71 | transform: scale(0.01); 72 | -webkit-transform-origin: 100% 95%; 73 | -ms-transform-origin: 100% 95%; 74 | transform-origin: 100% 95%; 75 | background: url(/static/module/common/img/elevator.png) no-repeat 0 -220px; 76 | } 77 | .elevator .elevator-app:hover .elevator-app-box { 78 | display: block; 79 | visibility: visible; 80 | opacity: 1; 81 | filter: alpha(opacity=100); 82 | max-width: none; 83 | -webkit-transform: scale(1); 84 | -ms-transform: scale(1); 85 | transform: scale(1); 86 | } 87 | .elevator .elevator-weixin-box { 88 | position: absolute; 89 | width: 172px; 90 | height: 212px; 91 | bottom: -10px; 92 | right: 52px; 93 | -webkit-transition: opacity 0.25s, transform .3s; 94 | -moz-transition: opacity 0.25s, transform .3s; 95 | transition: opacity 0.25s, transform .3s; 96 | opacity: 0; 97 | filter: alpha(opacity=0); 98 | max-width: 0; 99 | -webkit-transform: scale(0.01); 100 | -ms-transform: scale(0.01); 101 | transform: scale(0.01); 102 | -webkit-transform-origin: 100% 95%; 103 | -ms-transform-origin: 100% 95%; 104 | transform-origin: 100% 95%; 105 | background: url(/static/module/common/img/elevator.png) no-repeat 0 0; 106 | } 107 | .elevator .elevator-weixin:hover .elevator-weixin-box { 108 | display: block; 109 | visibility: visible; 110 | opacity: 1; 111 | filter: alpha(opacity=100); 112 | max-width: none; 113 | -webkit-transform: scale(1); 114 | -ms-transform: scale(1); 115 | transform: scale(1); 116 | }*/.program-nav{padding-right:10px!important}.shop-cart.hover .my-cart{display:block}.shop-cart.hover .shop-cart-icon{color:#fff}.shop-cart{position:relative;height:60px;line-height:60px}.shop-cart:hover .shop-cart-icon{background-color:rgba(77,85,93,.4)}.shop-cart:hover .shop-cart-icon span{color:#fff}.shop-cart .shop-cart-icon{width:107px!important;height:60px;display:inline-block;padding:0 18px;-webkit-box-sizing:border-box;box-sizing:border-box}.shop-cart .shop-cart-icon span{color:#71777d;font-size:14px}.shop-cart .shop-cart-icon .imv2-cart{position:relative;top:6px;font-size:24px}.shop-cart .shop-cart-icon .shopping_icon{position:absolute;padding:0 5px;height:16px;left:32px;top:10px;line-height:16px;background:#f01414;border-radius:50%;color:#fff;font-style:normal;font-size:10px}.shop-cart .my-cart{padding:0 12px;position:absolute;right:0;top:100%;width:350px;background:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;display:none;-webkit-box-shadow:0 4px 8px 0 rgba(7,17,27,.2);box-shadow:0 4px 8px 0 rgba(7,17,27,.2);z-index:99999}.shop-cart .my-cart .cart-title-box{padding:20px 12px;border-bottom:1px solid #d9dde1}.shop-cart .my-cart .cart-title-box h2{height:16px;font-size:16px;color:#07111b;line-height:16px}.shop-cart .my-cart .cart-title-box h5{height:16px;line-height:16px;font-size:12px;color:#93999f}.shop-cart .my-cart .cart-wrap .cart-wrap-box{height:284px;overflow-y:scroll}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul{width:100%}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li{padding:12px 12px 8px 12px;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #d9dde1}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li:hover{background:#f3f5f7}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li:hover .del{display:block}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li a{width:auto;height:auto}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li img{width:100px;height:56px;margin-right:12px}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li .content-box{width:170px}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li .content-box h3{word-break:break-word;font-size:12px;color:#07111b;line-height:16px}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li .content-box p{margin-top:16px;height:12px}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li .content-box p span{color:#f01414;font-size:12px;line-height:12px}.shop-cart .my-cart .cart-wrap .cart-wrap-box ul li .del{display:none;cursor:pointer}.shop-cart .my-cart .cart-wrap .clear-cart{height:284px;text-align:center;margin-top:0 auto}.shop-cart .my-cart .cart-wrap .clear-cart .cartIcon{margin-top:36px;margin-bottom:12px;display:inline-block;width:60px;height:60px;line-height:60px;background:#93999f;font-size:36px;color:#fff;border-radius:50%}.shop-cart .my-cart .cart-wrap .clear-cart h3{margin:0 auto;width:180px;padding-bottom:24px;border-bottom:1px solid #d9dde1;color:#4d555d;font-size:14px;line-height:14px}.shop-cart .my-cart .cart-wrap .clear-cart .text{text-align:center;margin-top:24px;margin-bottom:16px;font-size:12px;line-height:12px;color:#93999f}.shop-cart .my-cart .cart-wrap .clear-cart .go-link{display:block;color:#f01414;font-size:12px;line-height:12px;margin-bottom:16px}.shop-cart .my-cart .more-box{padding:16px 12px;border-top:1px solid #d9dde1}.shop-cart .my-cart .more-box .show-box{height:38px;line-height:38px}.shop-cart .my-cart .more-box .show-box .num-icon{width:16px;height:16px;font-size:10px;color:#fff;line-height:10px;padding:3px 6px;border-radius:50%;background:#f01414;-webkit-box-sizing:border-box;box-sizing:border-box}.shop-cart .my-cart .more-box .show-box .text{font-size:12px;color:#93999f}.shop-cart .my-cart .more-box .show-box .text a{color:#93999f}.shop-cart .my-cart .more-box .show-box .text a:hover{color:#f01414}.shop-cart .my-cart .more-box .show-box .go-pay a{color:#f01414;padding:0;font-size:12px}.shop-cart .my-cart .more-box .go-cart{color:#fff;font-size:12px;line-height:12px;font-weight:700;padding:12px 16px;border-radius:2px}.shop-cart .my-cart .more-box .go-cart:hover{background-color:#f04646}.star i{position:relative;color:#b5b9bc;font-size:16px}.star i.on{color:#f90}#main,body{background-color:#f3f5f7}#main{padding-top:0} 117 | 118 | /* banner start*/@-webkit-keyframes spin1{to{-webkit-transform:rotate(1turn);transform:rotate(1turn);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}}@keyframes spin1{to{-webkit-transform:rotate(1turn);transform:rotate(1turn);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}}@-webkit-keyframes spin2{to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}}@keyframes spin2{to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}} 119 | 120 | /* 方块 */.image1{-webkit-animation:spin2 382s linear infinite;animation:spin2 382s linear infinite} 121 | 122 | /* 菱形 */ 123 | 124 | /* 叶子 */.image2,.image3{-webkit-animation:spin1 618s linear infinite;animation:spin1 618s linear infinite} 125 | 126 | /* 三角 */.image4{-webkit-animation:spin1 1024s linear infinite;animation:spin1 1024s linear infinite}*{margin:0;padding:0;text-decoration:none;font-weight:400;font-family:Microsoft YaHei}.MMM{position:absolute;left:0;right:0;bottom:0;top:0;background:rgba(0,0,0,.2);z-index:9}.wrap{width:100%;height:300px;position:relative}.program-banner-absolute{position:absolute;width:3174px;height:2624px;left:50%;margin-left:-1587px;top:50%;margin-top:-940px}.program-banner-wrap{width:100%;height:300px;position:relative;background-color:#1b324a;overflow:hidden}.program-banner-bk{width:3174px;height:2624px;position:relative}.program-banner-bk>div{background-size:contain;background-repeat:no-repeat;opacity:.6;filter:alpha(opacity=60)}.svg-block{position:absolute;width:848px;height:848px;left:0;top:0;background:url(block.0a96eda7272e329c7b90.png);z-index:2}.svg-diamond{position:absolute;width:1213px;height:1213px;left:215px;top:190px;background:url(diamond.454689b5ab7b8692c1f1.png);z-index:3}.svg-leaf{position:absolute;width:930px;height:930px;left:1060px;top:450px;background:url(leaf.d0864f3f22f32f4b4651.png);z-index:2}.svg-small-circle{position:absolute;width:864px;height:864px;right:478px;top:336px;background:url(small-circle.771cfdc0c72adb7fd566.png);z-index:0}.svg-big-circle{position:absolute;width:1664px;height:1664px;right:811px;top:956px;background:url(big-circle.969431f8d648c59755fa.png);z-index:0}.svg-triangle{position:absolute;width:1374px;height:1184px;right:0;bottom:445px;background:url(triangle.79de0af5a0f1ae590e02.png);z-index:1} 127 | 128 | /* banner end*/.program-banner{width:100%;height:300px;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.program-banner .relative{position:relative;z-index:1}.program-banner .banner-head{z-index:10}.program-banner .banner-head>div{display:none;position:absolute;top:72px;left:0;right:0}.program-banner .banner-head>div.active{display:block}.program-banner .program-banner-bk{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;background-position:center 24%;background-size:cover}.program-banner .tit{font-size:36px;line-height:36px;letter-spacing:10px;margin-bottom:16px}.program-banner .intro,.program-banner .tit{color:#fff;text-align:center;text-shadow:0 4px 8px rgba(7,17,27,.4)}.program-banner .intro{margin-left:auto;margin-right:auto;font-size:14px;font-weight:200;width:880px;line-height:28px;height:56px;overflow:hidden}.program-banner .intro span{margin:0 12px}.program-banner .tab-nav{position:absolute;width:1250px;height:120px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;border-radius:12px;-webkit-box-shadow:0 8px 16px rgba(7,17,27,.1);box-shadow:0 8px 16px rgba(7,17,27,.1);left:50%;bottom:-60px;margin-left:-619px;padding:28px 14px 0;z-index:10}.program-banner .navitem{float:left;width:108px;height:92px;text-align:center;cursor:pointer;position:relative;margin:0 20px}.program-banner .navitem .navicon{display:block;width:36px;height:36px;margin-left:auto;margin-right:auto;margin-bottom:8px;-webkit-transition:all .1s linear;transition:all .1s linear;margin-top:0;background-image:url(nav.ab4683ad05898b35b297.png);background-size:cover}.program-banner .navitem .navicon.course{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAACACAYAAADHy7H2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyM0UzOTIwOTlDNEQxMUU4QTIxRUE4REYyNjcwRjNBQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyM0UzOTIwQTlDNEQxMUU4QTIxRUE4REYyNjcwRjNBQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzRTM5MjA3OUM0RDExRThBMjFFQThERjI2NzBGM0FCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjIzRTM5MjA4OUM0RDExRThBMjFFQThERjI2NzBGM0FCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+shp/mgAADUZJREFUeNrsnQuQFMUZgLtn9rjHzsw+EA7O46F1+IigwqU0D2PUEixNLEsRjTEQFAxJWSrmNPgiBUYJVhQvD42Ij/gIEUGjogmGWKLGlKIHEcUXp6IHqFDe7c7M7R63O9P5e1lKYrhiem8ePbP9V03dorszf//z9f/o6enGhBAkRIgkTCBEgCBEgCBEgCBEgCBEgCBEgCBEgCBEgCBEgCBEgCBEgCBkEBLz4qQYY+4bTk46Kdbb0fEj+jne2vowXreuyL3OXj4gpCd3++AdAFNVL9I1rVNXVVI64DP9b/T/8Q6CVwf24sbx6BHKHmC6jfEN0PJDB1D8Q4mQm8BDPMSjh/Cyk0UeBApArqNjhoXx9QMCsB8gZEJubmhtfZAnIAQIFQJgbNz4Y7AeBeCQChvyERw3qy0tD+KOjoIAIUQgkNbWGqOzkwJwXcUA7B+IRQDEA0ECIUBgA4B6gLHeWAtvLXuIQIAQIBwYgJllDzDWl4vuAYJ6iD/5CYQAYQAAzM7Oi8geAMYE4qsx/hjaukhpabnfDyAECPsa46ijhpjbtlEArg0MgP0D8Wulufl+vHlzvwDBQxD2AkBDAOg8mscBH2j3JzRkeAVEVYNQBuBisMK1vAIwABDUQ9znJhBVCUIZgFllAEZ5oGQWtGwvXQuhuXCdhAd26CoDca8bQFQVCKSlpdbcuXMWfLzGSwAUSWrHmUymdM1kMmna9lxPgUBosTJ8+L24s3O3AMEJANQDINTsBwD/p4PXQCC0reQhKgQi0iCUAZgNrbwmKAACAoJ6iHtYgIgkCGUALikDcDAPAAQAxPYyEMucABEpEMjYsXVmdzcFYB6vAAQExC1KOr0Mb93aF2kQ9gGAeoCmMAAQABA7Sh5iACBCDUIZgJ+UPUAoAQgICOoh7t4XiFCCQAHo7e6eQ/YAMDIKAAQAxKdgy1vi6fRSCkToQDCTyXORbf8uqgAEAQSSpMuVTGaVV23wZDo7wPV91yHAOAO9Y4Eqy2NUXV/ACwQl1UAXqhPVjepIdXXVnmBLalMv28D/ew1fAjAWjL0Q9/RkuVUVdKM6Ul29AKI6QQgRAFEAQhIACCD4AiFCAIQRCEkAIICgEvgrXiWjRPjmDwQE/FlIUql2o1jMCI/wpVGqUnhqu3gtXogAQUjEQchp2vHi1goQUBGhFbqmPdOnqodHqFlEgFCR2cgZBYTeBCCWQHaeEH2+inME6EI1AMSVZrG4xUgk5pAFC0ROVM3JIgAxjNj2XeZtt20wksmTxG2v8qoBgDiGWNbzhqquyicSh4jbX+XlIwAxtWjb7wAQN5NhwxSBQRWPIwAMtXBcZ/b1vW9q2gxCCBYgVLHQ2T82IQ9AMvlKTtO+IUCoeiLIcRYh/zY07eHc0KEHCxCq2zvQybwXFguF9wCI+XQmtgBhEALWdLyMDJernRISByBuNLq734WQcZ5nl2FoO9i0GD6PgHHe8Xc3b+a31xEyhtj2CqguXuxNJie6fv533qn1xKYceQTHSpuyXB+CkPEd27JeByCWGY2Nw107cS7nuBMQjPtCBwJhoFfu7w9FHAYYJDhmk3x+i6mqV9EVXQZ7zvyQIXVedC6eQHBMr1Qo1KMwCSGajdBvjK6ut3pV9cxBGb9YrPOic3EDgsRAbzEWC2dmTsg4C6GnoLr4h5FOf62SUxRkuY7BptEODdAr4uEefiCTUaHwBgDxe6JpaUaP0BBpj8ASzyxZHomqV4Z7YdNKxJMankhSL7IsZ1+27VCP4mGM16JYbK7a3f02628tjEcih2+jg0fIhQ4E2bZ3FJ2TfnBICdgiE9IW1/XVg/CcTcR55/o0dKEB1dR0McS+5pABoIPRrlZHjRofN4zVgzyb47BYg1BX6ECov+yyT3FpDqmjbCsUHgHaY8NxD66vH6cYxq2uLK1LyEin16475pgd4UsWFyywoadvj4pHgBvxkiTLX1cN4xL18893ulhdOV1T6jOv95by7OkjxL8uh987lDQ1NfBJAP4YS9L5AMCJ8UxmowdXONwhMF1eN1Xy0IiOlKdDt3nTnMAZAL1QDfxSTaePULPZR724RD6ZHENHKR12lm1eNznmpUdwmhFDGXUs/HmVgxBAAILlck3NvIYvvtiOdN2za9mWNcHtTsUlCFDufIBs22nSdCwHXmC9jNAVDbr+ih+XsyTpaKf2AUC3hhYEiDmvW06hQejYAL0AXcvwmng2+xD89W0/Y/CYE5xezJbljtDmCA0tLW+Ckfsc3oyj6WZdPgOwG45FSl3dYYquP+gnBCxeEHS01Pr6DaEFge56BtnuRmc2IQ3mBx98y0cIHotJ0pFQDVyPd+0y/fZCvQcdNBKoO8Lh19/GO3bkQgtC2eDrnQdNa4oPALyBZflkAODc+mz2o6DCEenvP5Uh13rND534AQHj0zzUYxeWpJ8qbW2T1ExmXdB5KaSIUxh0Dz8IMRYQCJlkjBgxzGUACgDY7UosNk7NZpfSEU8uhikIOZXhBoUfhDpd74Sb8bnDygHjXG6yi+Xg3yD7nKDp+s95WrTKTKVotTDCYRt6IeneFHoQyo35K4PL/IFLnuh8AOB7dYbxHuJMiGVNZfAcf/dr72k/QFjJ0PDTzeHDGwdduur6q4hDoS/agjeY4fzuSKv80s1zEJQpU16gyZrD8BBD+fx0FFGBsPBdoMHRugx0DEYZMuSZyICAV66kA4yOwwPAMDOqIBDbZmnbs36OcfjyEiyUbisZQDgqp2nHRQ6CPQtynOs8ouLH/NTPFxDiEyeucxoeqFiEXB01EHp376abnDqaug+26o9L0urIgVCaXYPxUoafTDVSqfGR8QbNzfV0kzPH38d4hd9bFfm2PgKurb2Dku50TAFZ1vzIeANdn+N47ABExrjdbx19A0HZteszIH05Q601rdJXycLsDaCzvBjPZjdEFoTSxWT5doakEaNC4abQe4Ns9mcs3oDIcnsQevoKgtLTswmy4ecYYDhbTybPCisE+VRqtE13anFeKnyozp37ZORBKJdFi5m+b1l3hnUt5YJl3QUhTmUIC0uCejDmOwhKNvvP0vuCzr1Ck1ks3ho2CExNuxAgOJ3FGyijRi0LSt9AVlXDkvQLzLDsPF2pxEwkJocFArq8DiSI7Yw3Yr4rb0+FCQQlk/kPVBB/ZvmNTcgjfZrWwn2VQOde5nIrAd6DGMLlRqgU/hKk3oGts1gjSTfQCaQM5WQausszJJFIcR0S3n//DoDgRMa8aZ7vk2d5AaE+k/kY/tzG1t3IYaZtr/J7xrPjkKBpl8HdvIQxe14DedPaoHUPdOVVpbHxRvAKTAtMgKFPMbZsuZdMmyZzNV5AF9YiZAkjBEaNLM/hQf9AQcCdnbsljGfSufuMnmG6uWbNo24scedKOFDVmVDzPU5YXxjCuK2+p+eTqgeBSlzX6eTMW5iTMoTOMbu6niaNjYEuxqUnEvMAgvtZIaAltJbNLkOcCBeLciujRy8Er/AWMwyETDby+bUkmUz6Xh0QgiEnaEe2vZj5xxASYrI8m6fQxgUItH6uwfgcMFBPBXfkm6ZlvWAOGzbCNwggJJmJxHKA4QrmtlJnJkkzeAkJXIFApU7Xt0C+MM3xkjv/GyaOJn19m4xEYprnlUEqNd7o6loHEFQ045pA2axlMk/wVvFwtV8DlFHPgVe4oiID79nJ7VG6cZerC2fvPX9TUwMkhYtRsbiBeqGKPB/GyyEvWMRj6cvdxh2qrt8JBvtDxTcMoakkn3/b1LQLXCsNNe0MwzQ3Q1I4r7SXZGUUrFfS6VmIU6E7lrh/Ujy4fbJoIgbGXwaGnzVIPdYSWV6o9fS8XMnv6ZY+Vn9/O2GYdDqAHh0KxpNxNtszSLtUFwh7YYBevZR5pG7/CdrzSJZ/pWYyzzv5Pt1TuoDQVfBxOt0NbpDGeF2VpMluzEGsShD2geGPoKEro2+g1cuQsbcrzc1PffVJX6kcTKdPwMXilfDPs4gbYRPj1wCCKW5NRK1aEPaB4Sa6R6OLCn4BGi7HknQfwbgIN/+HNsYXwMXGumiDZ5VY7Dzc3a27aIvqBWGv0IkeoOs9oC33+ztA+3+rnHZaW/ktLyRAcFlymna8RcgTLJNBfQUAoQKRpEu9Gjr2EoRQ7ftI33LGdXUTgbSnOYTgXQnjb/P0/CCyIFCh70doun4mKH4xXSmdAwBs0GOJMnToxPIDtFBKqELDV4VOFy8Wi7fTJ5EB5QIbiSxfrvX0/MuP64kc4cC5A93XeTG05GSfCKBLAs1XstkVfk4xEznCgXOH9aphnCJBzU6nfrHMkGYMA5uQJM1WJ006UtX1R4KeZyg8wgGkT9PGFRC6tLToBiGJQd58ujLb4xAC7oAQ8FKQ7RKhoVLDNTbGzb6+6ci2KRTjGQHYDg25G9fW3k0TVC7aI0AYvOip1AnYsujDo7OhzaMHuPk74VgNxxMNra1rvN41RYAQsPQmEq22bdNK4xwCykqEPAnJ0pP1bW2v8LIoZyRAEBI+kYQJhAgQhAgQhAgQhAgQhAgQhAgQhBxY/ivAAATUUWls0EV7AAAAAElFTkSuQmCC)}.program-banner .navitem .navicon.all{background-position:0 0}.program-banner .navitem .navicon.fe{background-position:-35px 0}.program-banner .navitem .navicon.php{background-position:-72px 0}.program-banner .navitem .navicon.java{background-position:-106px 0}.program-banner .navitem .navicon.android{background-position:-143px 0}.program-banner .navitem .navicon.ios{background-position:-180px 0}.program-banner .navitem .navtext{font-size:14px;color:#93999f;line-height:14px;-webkit-transition:all .3s linear;transition:all .3s linear}.program-banner .navitem .navbot{position:absolute;bottom:0;left:0;right:0;display:none;height:2px;background-color:#f01414;line-height:0;overflow:hidden}.program-banner .navitem.active .navtext{color:#07111b}.program-banner .navitem.active .navbot{display:block}.program-banner .navitem:hover .navtext{color:#07111b}.program-banner .navitem:hover .navicon{margin-top:-4px}.program-list{width:1200px;margin-left:auto;margin-right:auto;padding-top:108px;text-align:center}.program-list .program-list-wrap{display:inline-block}.program-item,.program-list .program-item{margin-right:32px}.program-item{position:relative;cursor:default;float:left;width:276px;height:326px;-webkit-transition:all .3s linear;transition:all .3s linear;margin-bottom:32px;text-align:left}.program-item:nth-child(4n){margin-right:0}.program-item:hover .c-line,.program-item:hover .d-line,.program-item:hover .shadow{-webkit-box-shadow:0 8px 6px 0 rgba(7,17,27,.2);box-shadow:0 8px 6px 0 rgba(7,17,27,.2)}.program-item:hover .program-list-head>div{-webkit-transform:scale(1.2);transform:scale(1.2)}#repo-bg-1{background-image:url(1.6084fd2574733b9b8f1c.jpg)}#repo-bg-2{background-image:url(2.eedf1a27ac2483af08fb.jpg)}#repo-bg-3{background-image:url(3.6582b2593d6fa36d225e.jpg)}#repo-bg-4{background-image:url(4.5e3032965832c883d0ab.jpg)}#repo-bg-5{background-image:url(5.c4ab0002b6ec34beedde.jpg)}#repo-bg-6{background-image:url(6.794cc1e4903d66438b33.jpg)}#repo-bg-7{background-image:url(7.916943b50468dd007104.jpg)}#repo-bg-8{background-image:url(8.1448366f152b40071c09.jpg)}#repo-bg-9{background-image:url(9.807aeaa6ff4269579383.jpg)}#repo-bg-10{background-image:url(10.4f242417d136861b0983.jpg)}#repo-bg-11{background-image:url(data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAFSCAMAAAAZy1EVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyY2ZmYzk3ZC00ZGE4LTM3NGEtOTA3ZS01YmUwZWJjMjkxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6REMwRDNENUMyOThDMTFFN0I2QjlBODRERkVDNDBFOUUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6REMwRDNENUIyOThDMTFFN0I2QjlBODRERkVDNDBFOUUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N2Q4N2EyZWYtMDBiNi1iODRkLWJhNDMtMDU5MGMxNTY1YzRiIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZGM3MjUyZTAtMWRiMi0xMWU3LTk3NDct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)} 129 | 130 | /*#repo-bg-12 { 131 | background-image: url(../img/12.jpg); 132 | }*/.program-item .shadow{-webkit-transition:all .3s linear;transition:all .3s linear;-webkit-box-shadow:0 4px 8px 0 rgba(7,17,27,.1);box-shadow:0 4px 8px 0 rgba(7,17,27,.1);overflow:hidden}.program-item .program-list-head{height:96px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:#f3f5f7;overflow:hidden}.program-item .program-list-head div{background-size:cover;-webkit-transition:all .3s linear;transition:all .3s linear;height:96px}.program-item .program-list-cont{position:relative;height:220px;overflow:hidden;background-color:#fff;padding:0 24px;border-bottom-right-radius:6px;border-bottom-left-radius:6px}.program-item .program-list-tit{width:100%;padding:22px 0 8px;color:#07111b;font-size:16px;line-height:28px;max-height:55px;letter-spacing:-.1px;word-break:break-all}.program-item .program-list-dest,.program-item .program-list-tit{text-overflow:ellipsis;word-wrap:break-word;overflow:hidden;text-overflow:-o-ellipsis-lastline;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.program-item .program-list-dest{font-size:12px;line-height:24px;height:68px;max-height:68px;word-break:normal;color:#333;word-break:break-all}.program-item .program-list-bot{position:absolute;height:24px;bottom:24px;left:24px;right:24px}.program-item .text{float:left;font-size:13px;color:#93999f;line-height:24px}.program-item .git{float:right;height:20px;line-height:24px;font-weight:200;font-size:14px}.program-item .git,.program-item .git>a,.program-item .text>a{color:#3b38ff!important}.program-item .c-line,.program-item .d-line{-webkit-transition:all .3s linear;transition:all .3s linear;background-color:#fff;height:3px;margin-left:auto;margin-right:auto;border-bottom-right-radius:6px;border-bottom-left-radius:6px;-webkit-box-shadow:0 4px 8px 0 rgba(7,17,27,.1);box-shadow:0 4px 8px 0 rgba(7,17,27,.1)}.program-item .c-line{width:264px;margin-top:2px;margin-bottom:2px}.program-item .d-line{width:252px}.program-item .learn_rate{position:absolute;width:40px;height:24px;font-size:12px;line-height:24px;color:#fff;background-color:#07111b;font-weight:200;text-align:center;right:-4px;top:12px;z-index:1;border-top-left-radius:6px;border-bottom-left-radius:6px}.program-item .learn_rate:after{position:absolute;content:"";width:0;height:0;overflow:hidden;border-top:4px solid #07111b;border-right:4px solid transparent;right:0;bottom:-4px}.program-item .learn_rate i{line-height:24px}.program-item .item-new{position:absolute;width:40px;height:24px;border-radius:20px;text-align:center;line-height:24px;left:-8px;top:-8px;color:#f01414;border:2px solid #f01414;font-size:12px;background-color:#fff;font-weight:700}.program-combine{width:1200px;height:482px;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:72px;position:relative;overflow:hidden;margin-left:auto;margin-right:auto;border-radius:24px;margin-top:36px;background-color:#e4e6e8}.program-combine.js-pathCombine-1{margin-top:72px}.program-combine .program-combine-warp{overflow:hidden;padding-left:82px}.program-combine .program-combine-scroll{position:absolute;padding-top:64px;padding-left:64px;padding-right:40px;left:0;top:0;width:1150px}.program-combine .program-item:last-child .h-line{display:none}.program-combine .program-item .item-new{left:-8px}.program-combine .program-item .learn_rate{right:-4px}.program-combine .program-item .h-line{position:absolute;width:48px;height:16px;top:50%;left:100%;margin-top:-8px;background-color:#afb4b9}.program-combine .combine-l{float:left;width:424px;padding-top:32px;margin-right:48px}.program-combine .combine-r{float:left;width:648px}.program-combine .combine-tit{font-size:36px;color:#07111b;line-height:48px;max-height:96px}.program-combine .combine-dest,.program-combine .combine-intro{font-size:16px;font-weight:200;color:#07111b;line-height:32px}.program-combine .combine-intro{margin:16px 0}.program-combine .combine-list{padding-left:48px}.program-combine .program-item{margin-right:48px}.program-combine .combine-scroll-bar{position:absolute;left:82px;right:82px;bottom:48px;height:16px;display:none}.program-combine .combine-scroll-bar .c-scroll-l{width:100%;height:1px;line-height:1px;background:hsla(210,6%,73%,.5);margin-top:8px}.program-combine .combine-scroll-bar span{position:absolute;width:128px;height:16px;left:0;top:0;background-color:#fff;border-radius:8px;-webkit-box-shadow:0 2px 4px rgba(7,17,27,.1);box-shadow:0 2px 4px rgba(7,17,27,.1);-webkit-transition:-webkit-box-shadow .3s linear;transition:-webkit-box-shadow .3s linear;transition:box-shadow .3s linear;transition:box-shadow .3s linear,-webkit-box-shadow .3s linear;cursor:pointer}.program-combine .combine-scroll-bar span:hover{-webkit-box-shadow:0 4px 8px rgba(7,17,27,.2);box-shadow:0 4px 8px rgba(7,17,27,.2)}#repo-bg-gis520{background-image:url(gis520.0be815c44cd71c57af6a.png)}#repo-bg-jzt{background-image:url(jzt.fd03bcc5d11357137710.png)}/* You can add global styles to this file, and also import other style files */ -------------------------------------------------------------------------------- /docs/triangle.79de0af5a0f1ae590e02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/docs/triangle.79de0af5a0f1ae590e02.png -------------------------------------------------------------------------------- /e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { ProjectPage } from './app.po'; 2 | 3 | describe('project App', () => { 4 | let page: ProjectPage; 5 | 6 | beforeEach(() => { 7 | page = new ProjectPage(); 8 | }); 9 | 10 | it('should display message saying app works', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('app works!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, element, by } from 'protractor'; 2 | 3 | export class ProjectPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types":[ 8 | "jasmine", 9 | "node" 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/0.13/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular/cli'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular/cli/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | files: [ 19 | { pattern: './src/test.ts', watched: false } 20 | ], 21 | preprocessors: { 22 | './src/test.ts': ['@angular/cli'] 23 | }, 24 | mime: { 25 | 'text/x-typescript': ['ts','tsx'] 26 | }, 27 | coverageIstanbulReporter: { 28 | reports: [ 'html', 'lcovonly' ], 29 | fixWebpackSourcePaths: true 30 | }, 31 | angularCli: { 32 | environment: 'dev' 33 | }, 34 | reporters: config.angularCli && config.angularCli.codeCoverage 35 | ? ['progress', 'coverage-istanbul'] 36 | : ['progress', 'kjhtml'], 37 | port: 9876, 38 | colors: true, 39 | logLevel: config.LOG_INFO, 40 | autoWatch: true, 41 | browsers: ['Chrome'], 42 | singleRun: false 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project", 3 | "version": "1.1.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve", 8 | "build": "ng build", 9 | "aot": "ng build --prod && npm run cname", 10 | "build:aot": "ng build --prod && npm run cname", 11 | "test": "ng test", 12 | "lint": "ng lint", 13 | "cname": "node ./scripts/cname.js", 14 | "e2e": "ng e2e" 15 | }, 16 | "private": true, 17 | "dependencies": { 18 | "@angular/animations": "^5.2.0", 19 | "@angular/common": "^5.2.0", 20 | "@angular/compiler": "^5.2.0", 21 | "@angular/core": "^5.2.0", 22 | "@angular/forms": "^5.2.0", 23 | "@angular/http": "^5.2.0", 24 | "@angular/platform-browser": "^5.2.0", 25 | "@angular/platform-browser-dynamic": "^5.2.0", 26 | "@angular/router": "^5.2.0", 27 | "core-js": "^2.4.1", 28 | "rxjs": "^5.5.6", 29 | "zone.js": "^0.8.19" 30 | }, 31 | "devDependencies": { 32 | "@angular/cli": "1.6.7", 33 | "@angular/compiler-cli": "^5.2.0", 34 | "@angular/language-service": "^5.2.0", 35 | "@types/jasmine": "~2.8.3", 36 | "@types/jasminewd2": "~2.0.2", 37 | "@types/node": "~6.0.60", 38 | "codelyzer": "^4.0.1", 39 | "fs-extra": "^8.0.0", 40 | "jasmine-core": "~2.8.0", 41 | "jasmine-spec-reporter": "~4.2.1", 42 | "karma": "~2.0.0", 43 | "karma-chrome-launcher": "~2.2.0", 44 | "karma-coverage-istanbul-reporter": "^1.2.1", 45 | "karma-jasmine": "~1.1.0", 46 | "karma-jasmine-html-reporter": "^0.2.2", 47 | "protractor": "~5.1.2", 48 | "ts-node": "~4.1.0", 49 | "tslint": "~5.9.1", 50 | "typescript": "~2.5.3" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | beforeLaunch: function() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | }, 27 | onPrepare() { 28 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /screenshot/demo-cp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/screenshot/demo-cp.gif -------------------------------------------------------------------------------- /screenshot/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/screenshot/demo.gif -------------------------------------------------------------------------------- /screenshot/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/screenshot/demo.png -------------------------------------------------------------------------------- /screenshot/demo/jzt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/screenshot/demo/jzt.gif -------------------------------------------------------------------------------- /screenshot/demo/jzt_compress.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/screenshot/demo/jzt_compress.gif -------------------------------------------------------------------------------- /scripts/cname.js: -------------------------------------------------------------------------------- 1 | const fse = require('fs-extra'); 2 | 3 | // 文件复制 4 | try { 5 | fse.copySync('./CNAME', './docs/CNAME'); 6 | console.log('Success: copy CNAME success!'); 7 | } catch (err) { 8 | console.error(err); 9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by giscafer on 2017/5/13. 3 | */ 4 | import {NgModule} from '@angular/core'; 5 | import {RouterModule, Routes} from '@angular/router'; 6 | import {ProjectItemComponent} from "./project-item/project-item.component"; 7 | 8 | const appRoutes: Routes = [ 9 | { 10 | path: '', 11 | component: ProjectItemComponent, 12 | pathMatch: 'full' 13 | }, 14 | // { 15 | // path: 'all', 16 | // component: ProjectItemComponent, 17 | // }, { 18 | // path: 'vue', 19 | // component: ProjectItemComponent, 20 | // }, { 21 | // path: 'angular', 22 | // component: ProjectItemComponent, 23 | // }, { 24 | // path: 'react', 25 | // component: ProjectItemComponent, 26 | // }, { 27 | // path: 'nodejs', 28 | // component: ProjectItemComponent, 29 | // }, { 30 | // path: 'app', 31 | // component: ProjectItemComponent, 32 | // }, { 33 | // path: 'other', 34 | // component: ProjectItemComponent, 35 | // }, 36 | { 37 | path: '**', redirectTo: "" 38 | } 39 | ] 40 | 41 | @NgModule({ 42 | imports: [ 43 | RouterModule.forRoot(appRoutes) 44 | ], 45 | exports: [ 46 | RouterModule 47 | ], 48 | declarations: [] 49 | }) 50 | export class AppRouteModule { 51 | } 52 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 | 11 | GitHub 12 | 13 | 14 | 个人主页 15 | 16 | 17 | 博客 18 | 19 | 20 | 微博 21 |
22 |
23 | 26 |
-------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/app/app.component.scss -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { Http } from "@angular/http"; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | templateUrl: './app.component.html', 7 | styleUrls: ['./app.component.scss'] 8 | }) 9 | export class AppComponent implements OnInit { 10 | 11 | 12 | allProjects: any[] = []; 13 | projects: any[] = []; 14 | 15 | hash: number = new Date().getTime(); 16 | 17 | constructor(private http: Http) { 18 | 19 | } 20 | 21 | ngOnInit(): void { 22 | this.http.get(`./data/data.json?v=${this.hash}`).subscribe(res => { 23 | let json = res.json(); 24 | this.allProjects = json; 25 | this.projects = json; 26 | }, err => { 27 | console.log(err); 28 | }) 29 | } 30 | 31 | navChange($event) { 32 | console.log($event); 33 | this.changeData($event); 34 | } 35 | 36 | changeData(type: string) { 37 | this.projects = this.filterPro(type); 38 | } 39 | 40 | filterPro(type: string): any[] { 41 | if (!type) { 42 | return this.allProjects; 43 | } 44 | return this.allProjects.filter(item => { 45 | return item.type.includes(type); 46 | }) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from "@angular/platform-browser"; 2 | import { NgModule } from "@angular/core"; 3 | import { HttpModule } from "@angular/http"; 4 | import { FormsModule } from "@angular/forms"; 5 | import { AppComponent } from "./app.component"; 6 | import { BannerHeadComponent } from "./banner-head/banner-head.component"; 7 | import { AppRouteModule } from "./app-routing.module"; 8 | import { ProjectItemComponent } from "./project-item/project-item.component"; 9 | 10 | @NgModule({ 11 | declarations: [ 12 | AppComponent, 13 | BannerHeadComponent, 14 | ProjectItemComponent 15 | ], 16 | imports: [ 17 | BrowserModule, 18 | FormsModule, 19 | HttpModule, 20 | AppRouteModule 21 | ], 22 | providers: [], 23 | bootstrap: [AppComponent] 24 | }) 25 | export class AppModule { } 26 | -------------------------------------------------------------------------------- /src/app/banner-head/banner-head.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 15 | 16 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/app/banner-head/banner-head.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/app/banner-head/banner-head.component.scss -------------------------------------------------------------------------------- /src/app/banner-head/banner-head.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, AfterContentInit, Output, EventEmitter } from '@angular/core'; 2 | import { NAVS } from "../../mock-data/nav-data"; 3 | import { Router } from "@angular/router"; 4 | 5 | @Component({ 6 | selector: 'banner-head', 7 | templateUrl: './banner-head.component.html', 8 | styleUrls: ['./banner-head.component.scss'] 9 | }) 10 | export class BannerHeadComponent implements OnInit, AfterContentInit { 11 | 12 | @Output() 13 | navChange = new EventEmitter(); 14 | 15 | public navs: any[] = []; 16 | public navs2: any[] = []; 17 | public firstNav: any; 18 | 19 | public curRoutePath: string = '/all'; 20 | 21 | constructor(private router: Router) { 22 | } 23 | 24 | ngOnInit() { 25 | this.navs = NAVS; 26 | let arr = [].concat(NAVS); 27 | this.firstNav = arr.shift(); 28 | this.navs2 = arr; 29 | } 30 | 31 | ngAfterContentInit(): void { 32 | if (location.pathname === '/') { 33 | this.curRoutePath = '/all'; 34 | } else { 35 | this.curRoutePath = location.pathname; 36 | } 37 | } 38 | 39 | navClick(path: string) { 40 | this.curRoutePath = path || '/all'; 41 | this.navChange.emit(path.substr(1)); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/app/project-item/project-item.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 |
7 |
8 |
21 |
22 | 23 | npm 24 |
25 |
26 | -------------------------------------------------------------------------------- /src/app/project-item/project-item.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/app/project-item/project-item.component.scss -------------------------------------------------------------------------------- /src/app/project-item/project-item.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { Router } from "@angular/router"; 3 | 4 | @Component({ 5 | selector: 'project-item', 6 | templateUrl: './project-item.component.html', 7 | styleUrls: ['./project-item.component.scss'] 8 | }) 9 | export class ProjectItemComponent implements OnInit { 10 | 11 | @Input() 12 | projects: any[] = []; 13 | 14 | constructor(private router: Router) { 15 | } 16 | 17 | ngOnInit() { 18 | 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f3f5f7; 3 | } 4 | 5 | #main { 6 | padding-top: 0; 7 | background-color: #f3f5f7; 8 | } 9 | 10 | 11 | /* banner start*/ 12 | 13 | @keyframes spin1 { 14 | 100% { 15 | transform: rotate(360deg); 16 | transform-origin: 50% 50%; 17 | } 18 | } 19 | 20 | @keyframes spin2 { 21 | 100% { 22 | transform: rotate(-360deg); 23 | transform-origin: 50% 50%; 24 | } 25 | } 26 | 27 | 28 | /* 方块 */ 29 | 30 | .image1 { 31 | animation: spin2 382s linear infinite; 32 | } 33 | 34 | 35 | /* 菱形 */ 36 | 37 | .image2 { 38 | animation: spin1 618s linear infinite; 39 | } 40 | 41 | 42 | /* 叶子 */ 43 | 44 | .image3 { 45 | animation: spin1 618s linear infinite; 46 | } 47 | 48 | 49 | /* 三角 */ 50 | 51 | .image4 { 52 | animation: spin1 1024s linear infinite; 53 | } 54 | 55 | * { 56 | margin: 0; 57 | padding: 0; 58 | text-decoration: none; 59 | font-weight: normal; 60 | font-family: "Microsoft YaHei"; 61 | } 62 | 63 | .MMM { 64 | position: absolute; 65 | left: 0; 66 | right: 0; 67 | bottom: 0; 68 | top: 0; 69 | background: rgba(0, 0, 0, 0.2); 70 | z-index: 9; 71 | } 72 | 73 | .wrap { 74 | width: 100%; 75 | height: 300px; 76 | position: relative; 77 | } 78 | 79 | .program-banner-absolute { 80 | position: absolute; 81 | width: 3174px; 82 | height: 2624px; 83 | left: 50%; 84 | margin-left: -1587px; 85 | top: 50%; 86 | margin-top: -940px; 87 | } 88 | 89 | .program-banner-wrap { 90 | width: 100%; 91 | height: 300px; 92 | position: relative; 93 | background-color: #1b324a; 94 | overflow: hidden; 95 | } 96 | 97 | .program-banner-bk { 98 | width: 3174px; 99 | height: 2624px; 100 | position: relative; 101 | } 102 | 103 | .program-banner-bk>div { 104 | background-size: contain; 105 | background-repeat: no-repeat; 106 | opacity: 0.6; 107 | filter: alpha(opacity=60); 108 | } 109 | 110 | .svg-block { 111 | position: absolute; 112 | width: 848px; 113 | height: 848px; 114 | left: 0; 115 | top: 0; 116 | background: url(../img/block.png); 117 | z-index: 2; 118 | } 119 | 120 | .svg-diamond { 121 | position: absolute; 122 | width: 1213px; 123 | height: 1213px; 124 | left: 215px; 125 | top: 190px; 126 | background: url(../img/diamond.png); 127 | z-index: 3; 128 | } 129 | 130 | .svg-leaf { 131 | position: absolute; 132 | width: 930px; 133 | height: 930px; 134 | left: 1060px; 135 | top: 450px; 136 | background: url(../img/leaf.png); 137 | z-index: 2; 138 | } 139 | 140 | .svg-small-circle { 141 | position: absolute; 142 | width: 864px; 143 | height: 864px; 144 | right: 478px; 145 | top: 336px; 146 | background: url(../img/small-circle.png); 147 | z-index: 0; 148 | } 149 | 150 | .svg-big-circle { 151 | position: absolute; 152 | width: 1664px; 153 | height: 1664px; 154 | right: 811px; 155 | top: 956px; 156 | background: url(../img/big-circle.png); 157 | z-index: 0; 158 | } 159 | 160 | .svg-triangle { 161 | position: absolute; 162 | width: 1374px; 163 | height: 1184px; 164 | right: 0px; 165 | bottom: 445px; 166 | background: url(../img/triangle.png); 167 | z-index: 1; 168 | } 169 | 170 | 171 | /* banner end*/ 172 | 173 | .program-banner { 174 | width: 100%; 175 | height: 300px; 176 | box-sizing: border-box; 177 | position: relative; 178 | } 179 | 180 | .program-banner .relative { 181 | position: relative; 182 | z-index: 1; 183 | } 184 | 185 | .program-banner .banner-head { 186 | z-index: 10; 187 | } 188 | 189 | .program-banner .banner-head>div { 190 | display: none; 191 | position: absolute; 192 | top: 72px; 193 | left: 0; 194 | right: 0; 195 | } 196 | 197 | .program-banner .banner-head>div.active { 198 | display: block; 199 | } 200 | 201 | .program-banner .program-banner-bk { 202 | position: absolute; 203 | left: 0; 204 | top: 0; 205 | right: 0; 206 | bottom: 0; 207 | overflow: hidden; 208 | background-position: center 24%; 209 | background-size: cover; 210 | } 211 | 212 | .program-banner .tit { 213 | font-size: 36px; 214 | color: #fff; 215 | line-height: 36px; 216 | text-align: center; 217 | text-shadow: 0px 4px 8px rgba(7, 17, 27, 0.4); 218 | letter-spacing: 10px; 219 | margin-bottom: 16px; 220 | } 221 | 222 | .program-banner .intro { 223 | margin-left: auto; 224 | margin-right: auto; 225 | font-size: 14px; 226 | font-weight: 200; 227 | color: #fff; 228 | width: 880px; 229 | line-height: 28px; 230 | height: 56px; 231 | overflow: hidden; 232 | text-align: center; 233 | text-shadow: 0px 4px 8px rgba(7, 17, 27, 0.4); 234 | } 235 | 236 | .program-banner .intro span { 237 | margin: 0 12px; 238 | } 239 | 240 | .program-banner .tab-nav { 241 | position: absolute; 242 | width: 1250px; 243 | height: 120px; 244 | -webkit-box-sizing: border-box; 245 | box-sizing: border-box; 246 | background-color: #fff; 247 | border-radius: 12px; 248 | -webkit-box-shadow: 0px 8px 16px rgba(7, 17, 27, 0.1); 249 | box-shadow: 0px 8px 16px rgba(7, 17, 27, 0.1); 250 | left: 50%; 251 | bottom: -60px; 252 | margin-left: -619px; 253 | padding: 28px 14px 0; 254 | z-index: 10; 255 | } 256 | 257 | .program-banner .navitem { 258 | float: left; 259 | width: 108px; 260 | height: 92px; 261 | text-align: center; 262 | cursor: pointer; 263 | position: relative; 264 | margin: 0 20px; 265 | } 266 | 267 | .program-banner .navitem .navicon { 268 | display: block; 269 | width: 36px; 270 | height: 36px; 271 | margin-left: auto; 272 | margin-right: auto; 273 | margin-bottom: 8px; 274 | transition: .1s all linear; 275 | margin-top: 0; 276 | background-image: url(../img/nav.png); 277 | background-size: cover; 278 | } 279 | 280 | .program-banner .navitem .navicon.course { 281 | background-image: url(../img/course.png); 282 | } 283 | 284 | .program-banner .navitem .navicon.all { 285 | background-position: 0 0; 286 | } 287 | 288 | .program-banner .navitem .navicon.fe { 289 | background-position: -35px 0; 290 | } 291 | 292 | .program-banner .navitem .navicon.php { 293 | background-position: -72px 0; 294 | } 295 | 296 | .program-banner .navitem .navicon.java { 297 | background-position: -106px 0; 298 | } 299 | 300 | .program-banner .navitem .navicon.android { 301 | background-position: -143px 0; 302 | } 303 | 304 | .program-banner .navitem .navicon.ios { 305 | background-position: -180px 0; 306 | } 307 | 308 | .program-banner .navitem .navtext { 309 | font-size: 14px; 310 | color: #93999f; 311 | line-height: 14px; 312 | transition: .3s all linear; 313 | } 314 | 315 | .program-banner .navitem .navbot { 316 | position: absolute; 317 | bottom: 0; 318 | left: 0; 319 | right: 0; 320 | display: none; 321 | height: 2px; 322 | background-color: #f01414; 323 | line-height: 0; 324 | overflow: hidden; 325 | } 326 | 327 | .program-banner .navitem.active .navtext { 328 | color: #07111b; 329 | } 330 | 331 | .program-banner .navitem.active .navbot { 332 | display: block; 333 | } 334 | 335 | .program-banner .navitem:hover .navtext { 336 | color: #07111b; 337 | } 338 | 339 | .program-banner .navitem:hover .navicon { 340 | margin-top: -4px; 341 | } 342 | 343 | .program-list { 344 | width: 1200px; 345 | margin-left: auto; 346 | margin-right: auto; 347 | padding-top: 108px; 348 | text-align: center; 349 | } 350 | 351 | .program-list .program-list-wrap { 352 | display: inline-block; 353 | } 354 | 355 | .program-list .program-item { 356 | margin-right: 32px; 357 | } 358 | 359 | .program-item { 360 | position: relative; 361 | cursor: default; 362 | float: left; 363 | width: 276px; 364 | height: 326px; 365 | transition: all linear .3s; 366 | margin-right: 32px; 367 | margin-bottom: 32px; 368 | text-align: left; 369 | } 370 | 371 | .program-item:nth-child(4n) { 372 | margin-right: 0px; 373 | } 374 | 375 | .program-item:hover .shadow { 376 | box-shadow: 0px 8px 6px 0px rgba(7, 17, 27, 0.2); 377 | } 378 | 379 | .program-item:hover .c-line, 380 | .program-item:hover .d-line { 381 | box-shadow: 0px 8px 6px 0px rgba(7, 17, 27, 0.2); 382 | } 383 | 384 | .program-item:hover .program-list-head>div { 385 | transform: scale(1.2); 386 | } 387 | 388 | #repo-bg-1 { 389 | background-image: url(../img/1.jpg); 390 | } 391 | 392 | #repo-bg-2 { 393 | background-image: url(../img/2.jpg); 394 | } 395 | 396 | #repo-bg-3 { 397 | background-image: url(../img/3.jpg); 398 | } 399 | 400 | #repo-bg-4 { 401 | background-image: url(../img/4.jpg); 402 | } 403 | 404 | #repo-bg-5 { 405 | background-image: url(../img/5.jpg); 406 | } 407 | 408 | #repo-bg-6 { 409 | background-image: url(../img/6.jpg); 410 | } 411 | 412 | #repo-bg-7 { 413 | background-image: url(../img/7.jpg); 414 | } 415 | 416 | #repo-bg-8 { 417 | background-image: url(../img/8.jpg); 418 | } 419 | 420 | #repo-bg-9 { 421 | background-image: url(../img/9.jpg); 422 | } 423 | 424 | #repo-bg-10 { 425 | background-image: url(../img/10.jpg); 426 | } 427 | 428 | #repo-bg-11 { 429 | background-image: url(../img/11.jpg); 430 | } 431 | 432 | 433 | /*#repo-bg-12 { 434 | background-image: url(../img/12.jpg); 435 | }*/ 436 | 437 | .program-item .shadow { 438 | transition: all linear .3s; 439 | box-shadow: 0px 4px 8px 0px rgba(7, 17, 27, 0.1); 440 | overflow: hidden; 441 | } 442 | 443 | .program-item .program-list-head { 444 | height: 96px; 445 | border-top-left-radius: 6px; 446 | border-top-right-radius: 6px; 447 | background-color: #f3f5f7; 448 | overflow: hidden; 449 | } 450 | 451 | .program-item .program-list-head div { 452 | background-size: cover; 453 | transition: all linear .3s; 454 | height: 96px; 455 | } 456 | 457 | .program-item .program-list-cont { 458 | position: relative; 459 | height: 220px; 460 | overflow: hidden; 461 | background-color: #fff; 462 | padding: 0 24px; 463 | border-bottom-right-radius: 6px; 464 | border-bottom-left-radius: 6px; 465 | } 466 | 467 | .program-item .program-list-tit { 468 | width: 100%; 469 | padding: 22px 0 8px; 470 | color: #07111b; 471 | font-size: 16px; 472 | line-height: 28px; 473 | max-height: 55px; 474 | letter-spacing: -0.1px; 475 | text-overflow: ellipsis; 476 | word-break: break-all; 477 | word-wrap: break-word; 478 | overflow: hidden; 479 | text-overflow: -o-ellipsis-lastline; 480 | display: -webkit-box; 481 | -webkit-line-clamp: 2; 482 | -webkit-box-orient: vertical; 483 | } 484 | 485 | .program-item .program-list-dest { 486 | font-size: 12px; 487 | line-height: 24px; 488 | height: 68px; 489 | max-height: 68px; 490 | word-break: normal; 491 | color: #333; 492 | text-overflow: ellipsis; 493 | word-break: break-all; 494 | word-wrap: break-word; 495 | overflow: hidden; 496 | text-overflow: -o-ellipsis-lastline; 497 | display: -webkit-box; 498 | -webkit-line-clamp: 2; 499 | -webkit-box-orient: vertical; 500 | } 501 | 502 | .program-item .program-list-bot { 503 | position: absolute; 504 | height: 24px; 505 | bottom: 24px; 506 | left: 24px; 507 | right: 24px; 508 | } 509 | 510 | .program-item .text { 511 | float: left; 512 | font-size: 13px; 513 | color: #93999f; 514 | line-height: 24px; 515 | } 516 | 517 | .program-item .git { 518 | float: right; 519 | height: 20px; 520 | color: #3b38ff!important; 521 | line-height: 24px; 522 | font-weight: 200; 523 | font-size: 14px; 524 | } 525 | 526 | .program-item .git>a, 527 | .program-item .text>a { 528 | color: #3b38ff!important; 529 | } 530 | 531 | .program-item .c-line, 532 | .program-item .d-line { 533 | transition: all linear .3s; 534 | background-color: #fff; 535 | height: 3px; 536 | margin-left: auto; 537 | margin-right: auto; 538 | border-bottom-right-radius: 6px; 539 | border-bottom-left-radius: 6px; 540 | box-shadow: 0px 4px 8px 0px rgba(7, 17, 27, 0.1); 541 | } 542 | 543 | .program-item .c-line { 544 | width: 264px; 545 | margin-top: 2px; 546 | margin-bottom: 2px; 547 | } 548 | 549 | .program-item .d-line { 550 | width: 252px; 551 | } 552 | 553 | .program-item .learn_rate { 554 | position: absolute; 555 | width: 40px; 556 | height: 24px; 557 | font-size: 12px; 558 | line-height: 24px; 559 | color: #fff; 560 | background-color: #07111b; 561 | font-weight: 200; 562 | text-align: center; 563 | right: -4px; 564 | top: 12px; 565 | z-index: 1; 566 | border-top-left-radius: 6px; 567 | border-bottom-left-radius: 6px; 568 | } 569 | 570 | .program-item .learn_rate:after { 571 | position: absolute; 572 | content: ''; 573 | width: 0; 574 | height: 0; 575 | overflow: hidden; 576 | border-top: 4px solid #07111b; 577 | border-right: 4px solid transparent; 578 | right: 0; 579 | bottom: -4px; 580 | } 581 | 582 | .program-item .learn_rate i { 583 | line-height: 24px; 584 | } 585 | 586 | .program-item .item-new { 587 | position: absolute; 588 | width: 40px; 589 | height: 24px; 590 | border-radius: 20px; 591 | text-align: center; 592 | line-height: 24px; 593 | left: -8px; 594 | top: -8px; 595 | color: #f01414; 596 | border: 2px solid #f01414; 597 | font-size: 12px; 598 | background-color: #fff; 599 | font-weight: 700; 600 | } 601 | 602 | .program-combine { 603 | width: 1200px; 604 | height: 482px; 605 | box-sizing: border-box; 606 | padding-top: 72px; 607 | position: relative; 608 | overflow: hidden; 609 | margin-left: auto; 610 | margin-right: auto; 611 | border-radius: 24px; 612 | margin-top: 36px; 613 | background-color: #e4e6e8; 614 | } 615 | 616 | .program-combine.js-pathCombine-1 { 617 | margin-top: 72px; 618 | } 619 | 620 | .program-combine .program-combine-warp { 621 | overflow: hidden; 622 | padding-left: 82px; 623 | } 624 | 625 | .program-combine .program-combine-scroll { 626 | position: absolute; 627 | padding-top: 64px; 628 | padding-left: 64px; 629 | padding-right: 40px; 630 | left: 0; 631 | top: 0; 632 | width: 1150px; 633 | } 634 | 635 | .program-combine .program-item:last-child .h-line { 636 | display: none; 637 | } 638 | 639 | .program-combine .program-item .item-new { 640 | left: -8px; 641 | } 642 | 643 | .program-combine .program-item .learn_rate { 644 | right: -4px; 645 | } 646 | 647 | .program-combine .program-item .h-line { 648 | position: absolute; 649 | width: 48px; 650 | height: 16px; 651 | top: 50%; 652 | left: 100%; 653 | margin-top: -8px; 654 | background-color: #afb4b9; 655 | } 656 | 657 | .program-combine .combine-l { 658 | float: left; 659 | width: 424px; 660 | padding-top: 32px; 661 | margin-right: 48px; 662 | } 663 | 664 | .program-combine .combine-r { 665 | float: left; 666 | width: 648px; 667 | } 668 | 669 | .program-combine .combine-tit { 670 | font-size: 36px; 671 | color: #07111b; 672 | line-height: 48px; 673 | max-height: 96px; 674 | } 675 | 676 | .program-combine .combine-dest, 677 | .program-combine .combine-intro { 678 | font-size: 16px; 679 | font-weight: 200; 680 | color: #07111b; 681 | line-height: 32px; 682 | } 683 | 684 | .program-combine .combine-intro { 685 | margin: 16px 0; 686 | } 687 | 688 | .program-combine .combine-list { 689 | padding-left: 48px; 690 | } 691 | 692 | .program-combine .program-item { 693 | margin-right: 48px; 694 | } 695 | 696 | .program-combine .combine-scroll-bar { 697 | position: absolute; 698 | left: 82px; 699 | right: 82px; 700 | bottom: 48px; 701 | height: 16px; 702 | display: none; 703 | } 704 | 705 | .program-combine .combine-scroll-bar .c-scroll-l { 706 | width: 100%; 707 | height: 1px; 708 | line-height: 1px; 709 | background: rgba(183, 187, 191, 0.5); 710 | margin-top: 8px; 711 | } 712 | 713 | .program-combine .combine-scroll-bar span { 714 | position: absolute; 715 | width: 128px; 716 | height: 16px; 717 | left: 0; 718 | top: 0; 719 | background-color: #fff; 720 | border-radius: 8px; 721 | box-shadow: 0px 2px 4px rgba(7, 17, 27, 0.1); 722 | transition: 0.3s box-shadow linear; 723 | cursor: pointer; 724 | } 725 | 726 | .program-combine .combine-scroll-bar span:hover { 727 | box-shadow: 0px 4px 8px rgba(7, 17, 27, 0.2); 728 | } -------------------------------------------------------------------------------- /src/assets/css/project.css: -------------------------------------------------------------------------------- 1 | #repo-bg-gis520 { 2 | background-image: url(../img/gis520.png); 3 | } 4 | #repo-bg-jzt { 5 | background-image: url(../img/jzt.png); 6 | } -------------------------------------------------------------------------------- /src/assets/img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/1.jpg -------------------------------------------------------------------------------- /src/assets/img/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/10.jpg -------------------------------------------------------------------------------- /src/assets/img/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/11.jpg -------------------------------------------------------------------------------- /src/assets/img/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/2.jpg -------------------------------------------------------------------------------- /src/assets/img/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/3.jpg -------------------------------------------------------------------------------- /src/assets/img/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/4.jpg -------------------------------------------------------------------------------- /src/assets/img/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/5.jpg -------------------------------------------------------------------------------- /src/assets/img/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/6.jpg -------------------------------------------------------------------------------- /src/assets/img/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/7.jpg -------------------------------------------------------------------------------- /src/assets/img/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/8.jpg -------------------------------------------------------------------------------- /src/assets/img/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/9.jpg -------------------------------------------------------------------------------- /src/assets/img/angular.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/angular.jpg -------------------------------------------------------------------------------- /src/assets/img/big-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/big-circle.png -------------------------------------------------------------------------------- /src/assets/img/block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/block.png -------------------------------------------------------------------------------- /src/assets/img/course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/course.png -------------------------------------------------------------------------------- /src/assets/img/diamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/diamond.png -------------------------------------------------------------------------------- /src/assets/img/feteam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/feteam.jpg -------------------------------------------------------------------------------- /src/assets/img/feweekly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/feweekly.jpg -------------------------------------------------------------------------------- /src/assets/img/formbuilder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/formbuilder.jpg -------------------------------------------------------------------------------- /src/assets/img/gis520.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/gis520.jpg -------------------------------------------------------------------------------- /src/assets/img/gis520.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/gis520.png -------------------------------------------------------------------------------- /src/assets/img/graphql.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/graphql.jpg -------------------------------------------------------------------------------- /src/assets/img/header-icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/header-icon1.png -------------------------------------------------------------------------------- /src/assets/img/jzt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/jzt.png -------------------------------------------------------------------------------- /src/assets/img/leaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/leaf.png -------------------------------------------------------------------------------- /src/assets/img/live.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/live.jpg -------------------------------------------------------------------------------- /src/assets/img/nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/nav.png -------------------------------------------------------------------------------- /src/assets/img/npm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/npm.jpg -------------------------------------------------------------------------------- /src/assets/img/pwa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/pwa.jpg -------------------------------------------------------------------------------- /src/assets/img/react.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/react.jpg -------------------------------------------------------------------------------- /src/assets/img/rn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/rn.jpg -------------------------------------------------------------------------------- /src/assets/img/small-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/small-circle.png -------------------------------------------------------------------------------- /src/assets/img/triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/triangle.png -------------------------------------------------------------------------------- /src/assets/img/vdom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/vdom.jpg -------------------------------------------------------------------------------- /src/assets/img/vue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/vue.jpg -------------------------------------------------------------------------------- /src/assets/img/webcomponents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/assets/img/webcomponents.jpg -------------------------------------------------------------------------------- /src/data/data.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "type": [ 3 | "all", 4 | "vue", 5 | "nodejs" 6 | ], 7 | "img": "1", 8 | "title": "Ponitor", 9 | "subtitle": "Vue.js1.x • ES6 • Node.js • MongoDB", 10 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 11 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件), 商品价格趋势分析统计等!", 12 | "demoUrl": "http://project.xinong.wang:18080/", 13 | "gitUrl": "https://github.com/giscafer/Ponitor" 14 | }, 15 | { 16 | "type": [ 17 | "all", 18 | "react" 19 | ], 20 | "img": "react", 21 | "title": "react-ponitor", 22 | "subtitle": "react • react-redux", 23 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 24 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件),商品价格趋势分析统计等!", 25 | "demoUrl": "https://giscafer.github.io/react-ponitor/", 26 | "gitUrl": "https://github.com/giscafer/react-ponitor" 27 | }, 28 | { 29 | "type": [ 30 | "all", 31 | "other", 32 | "java" 33 | ], 34 | "img": "3", 35 | "title": "FinalScheduler", 36 | "subtitle": "JFinal2.0 • Bootstrap • SeaJS • FullCalender.js", 37 | "meta": "终极排班管理系统,灵活排班", 38 | "description": "终极排班管理系统,改变传统的排班模式!", 39 | "demoUrl": "", 40 | "gitUrl": "https://github.com/giscafer/FinalScheduler" 41 | }, 42 | { 43 | "type": [ 44 | "all", 45 | "other", 46 | "css" 47 | ], 48 | "img": "4", 49 | "title": "hexo-theme-cafe", 50 | "subtitle": "HTML • CSS • Hexo", 51 | "meta": "自定义 Hexo 博客框架主题,追求简约、操作简单、阅读舒适度", 52 | "description": "A theme of Hexo that is aimed at pursuit of simplicity, simple operation, reading comfort. 追求简约、操作简单、阅读舒适度", 53 | "demoUrl": "http://blog.giscafer.com/", 54 | "gitUrl": "https://github.com/giscafer/hexo-theme-cafe" 55 | }, 56 | { 57 | "type": [ 58 | "all", 59 | "other", 60 | "wechat" 61 | ], 62 | "img": "6", 63 | "title": "mapshaper-plus", 64 | "subtitle": "HTML • CSS • JavaScript", 65 | "meta": "Generate geojson files for Echarts Map,base on mapshaper", 66 | "description": "基于mapshaper对geojson地图数据的坐标信息进行压缩编码,并提供可直接生成压缩编码后的echarts map数据格式,通过mapshaper-plus可以直接将shp格式数据转换为压缩后的echarts数据", 67 | "demoUrl": "https://giscafer.github.io/mapshaper-plus/", 68 | "gitUrl": "https://github.com/giscafer/mapshaper-plus" 69 | }, 70 | { 71 | "type": [ 72 | "all", 73 | "other", 74 | "wechat" 75 | ], 76 | "img": "5", 77 | "title": "wechat-weapp-mapdemo", 78 | "subtitle": "HTML5 • CSS • JavaScript", 79 | "meta": "微信小程序开发demo,地图导航、marker标注", 80 | "description": "微信小程序开发demo,地图导航、marker标注", 81 | "demoUrl": "", 82 | "gitUrl": "https://github.com/giscafer/wechat-weapp-mapdemo" 83 | }, 84 | { 85 | "type": [ 86 | "all", 87 | "angular" 88 | ], 89 | "img": "formbuilder", 90 | "title": "ngx-form-builder", 91 | "subtitle": "jsonSchema 表单自动化构建,支持模板代码在线编辑、复制、下载", 92 | "meta": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 93 | "description": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 94 | "demoUrl": "http://form.giscafer.com", 95 | "gitUrl": "https://github.com/giscafer/ngx-form-builder" 96 | }, 97 | { 98 | "type": [ 99 | "all", 100 | "angular", 101 | "nodejs" 102 | ], 103 | "img": "angular", 104 | "title": "angular-chat", 105 | "subtitle": "Angular4 • Node.js • Socket.io", 106 | "meta": "(IM App)Chat App built using Angular and Socket.io", 107 | "description": "(IM App)Chat App built using Angular and Socket.io,模仿百度E秘聊天", 108 | "demoUrl": "http://project.xinong.wang:8080/", 109 | "gitUrl": "https://github.com/giscafer/angular-chat" 110 | }, 111 | { 112 | "type": [ 113 | "all", 114 | "react" 115 | ], 116 | "img": "react", 117 | "title": "ife-course-demo", 118 | "subtitle": "react", 119 | "meta": "百度前端技术学院demo演示SPA ", 120 | "description": "百度前端技术学院demo演示SPA ", 121 | "demoUrl": "http://ife.giscafer.com", 122 | "gitUrl": "https://github.com/giscafer/ife-course-demo" 123 | }, 124 | { 125 | "type": [ 126 | "all", 127 | "angular" 128 | ], 129 | "img": "angular", 130 | "title": "ng2-ife-course", 131 | "subtitle": "angular2", 132 | "meta": "百度前端技术学院demo演示SPA ", 133 | "description": "百度前端技术学院demo演示SPA ", 134 | "demoUrl": "http://ng2ife.giscafer.com", 135 | "gitUrl": "https://github.com/giscafer/ng2-ife-course" 136 | }, 137 | { 138 | "type": [ 139 | "all", 140 | "nodejs" 141 | ], 142 | "img": "10", 143 | "title": "moviesite", 144 | "subtitle": "Node.js • Jade • MongoDB", 145 | "meta": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,网站爬虫添加,电影查询删除等", 146 | "description": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,爬虫添加电影,电影查询删除等", 147 | "demoUrl": "", 148 | "gitUrl": "https://github.com/giscafer/moviesite" 149 | }, 150 | { 151 | "type": [ 152 | "all", 153 | "other", 154 | "wechat", 155 | "java" 156 | ], 157 | "img": "11", 158 | "title": "gisrobot", 159 | "subtitle": "Java • 微信公众号", 160 | "meta": " 微信公众号JAVA开发学习demo,天气预报查询、消息自动回复、中英文翻译", 161 | "description": "微信公众号开发机器人,天气预报查询、消息自动回复、中英文翻译", 162 | "demoUrl": "", 163 | "gitUrl": "https://github.com/giscafer/gisrobot" 164 | }, 165 | { 166 | "type": [ 167 | "all", 168 | "react" 169 | ], 170 | "img": "react", 171 | "title": "react-demo-list", 172 | "subtitle": "react", 173 | "meta": " react学习练习demo", 174 | "description": " react学习练习demo", 175 | "demoUrl": "https://giscafer.github.io/react-demo-list/", 176 | "gitUrl": "https://github.com/giscafer/react-demo-list" 177 | }, 178 | { 179 | "type": [ 180 | "all", 181 | "vue", 182 | "nodejs" 183 | ], 184 | "img": "vue", 185 | "title": "Vue-order", 186 | "subtitle": "vue.js1.x • Node.js • MongoDB", 187 | "meta": " nodejs+vue.js学习开发demo,订餐系统应用 ", 188 | "description": "nodejs+vue.js学习开发demo,订餐系统应用", 189 | "demoUrl": "", 190 | "gitUrl": "https://github.com/giscafer/Vue-order" 191 | }, 192 | { 193 | "type": [ 194 | "all", 195 | "nodejs", 196 | "npm" 197 | ], 198 | "img": "3", 199 | "title": "alidayujs", 200 | "subtitle": "NPM • Node.js", 201 | "meta": "阿里大鱼短信SDK( JavaScript Alidayu SDK)封装成npm插件", 202 | "description": "JavaScript Alidayu SDK 兼容服务器端环境node.js,模块加载器如RequireJS和所有浏览器", 203 | "npm": "https://www.npmjs.com/package/alidayujs", 204 | "demoUrl": "", 205 | "gitUrl": "https://github.com/giscafer/alidayujs" 206 | }, 207 | { 208 | "type": [ 209 | "all", 210 | "nodejs", 211 | "npm" 212 | ], 213 | "img": "3", 214 | "title": "node-ipcity", 215 | "subtitle": "NPM • Node.js", 216 | "meta": "Get ip city info 获取ip归属城市信息 | NPM插件", 217 | "description": "get ip city info 获取ip归属城市信息", 218 | "npm": "https://www.npmjs.com/package/node-ipcity", 219 | "demoUrl": "", 220 | "gitUrl": "https://github.com/giscafer/node-ipcity" 221 | }, 222 | { 223 | "type": [ 224 | "all", 225 | "nodejs", 226 | "npm" 227 | ], 228 | "img": "3", 229 | "title": "node-typhoon", 230 | "subtitle": "NPM • Node.js", 231 | "meta": "Help you get the typhoon information 台风信息查询Api | NPM插件", 232 | "description": "Help you get the typhoon information 台风信息查询Api", 233 | "npm": "https://www.npmjs.com/package/node-typhoon", 234 | "demoUrl": "", 235 | "gitUrl": "https://github.com/giscafer/node-typhoon" 236 | }, 237 | { 238 | "type": [ 239 | "all", 240 | "nodejs", 241 | "angular" 242 | ], 243 | "img": "5", 244 | "title": "git-batch-file-builder", 245 | "subtitle": "angular1.x • Git • Node.js", 246 | "meta": "Git Batch File Builder,git批处理文件创建", 247 | "description": "Git Batch File Builder,git批处理文件创建", 248 | "demoUrl": "", 249 | "gitUrl": "https://github.com/giscafer/git-batch-file-builder" 250 | }, 251 | { 252 | "type": [ 253 | "all", 254 | "nodejs", 255 | "other" 256 | ], 257 | "img": "6", 258 | "title": "generate-form-by-table-structure", 259 | "subtitle": "Node.js", 260 | "meta": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 261 | "description": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 262 | "demoUrl": "", 263 | "gitUrl": "https://github.com/giscafer/generate-form-by-table-structure" 264 | }, 265 | { 266 | "type": [ 267 | "all", 268 | "other", 269 | "java" 270 | ], 271 | "img": "7", 272 | "title": "physicaltable", 273 | "subtitle": "Java • BootStrap", 274 | "meta": "一个关于体育成绩登记的简单站点", 275 | "description": "一个关于体育成绩登记的简单站点", 276 | "demoUrl": "", 277 | "gitUrl": "https://github.com/giscafer/physicaltable" 278 | }, 279 | { 280 | "type": [ 281 | "all", 282 | "angular" 283 | ], 284 | "img": "angular", 285 | "title": "angular-webuploader", 286 | "subtitle": "angular1.x • webuploader", 287 | "meta": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 288 | "description": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 289 | "demoUrl": "", 290 | "gitUrl": "https://github.com/giscafer/angular-webuploader" 291 | }, 292 | { 293 | "type": [ 294 | "all", 295 | "angular" 296 | ], 297 | "img": "angular", 298 | "title": "laoui-bootstrap", 299 | "subtitle": "angular1.x • bootstrap", 300 | "meta": "基于bootstrap与angularjs1.x的UI组件封装", 301 | "description": "基于bootstrap与angularjs1.x的UI组件", 302 | "demoUrl": "http://laoui.giscafer.com", 303 | "gitUrl": "" 304 | }, 305 | { 306 | "type": [ 307 | "all", 308 | "angular" 309 | ], 310 | "img": "angular", 311 | "title": "ng-ace-tern", 312 | "subtitle": "NPM • Angular", 313 | "meta": "Tern plugin for Ace Editor for Angular", 314 | "description": "Tern plugin for Ace Editor for Angular", 315 | "npm": "https://www.npmjs.com/package/ng-ace-tern", 316 | "demoUrl": "", 317 | "gitUrl": "https://github.com/giscafer/ng-ace-tern" 318 | }, 319 | { 320 | "type": [ 321 | "all", 322 | "angular" 323 | ], 324 | "img": "angular", 325 | "title": "ng-viewer", 326 | "subtitle": "Angular", 327 | "meta": "An angular directive for viewer.js", 328 | "description": "An angular directive for viewer.js", 329 | "demoUrl": "", 330 | "gitUrl": "https://github.com/giscafer/ng-viewer" 331 | }, 332 | { 333 | "type": [ 334 | "all", 335 | "angular" 336 | ], 337 | "img": "angular", 338 | "title": "primeng-ext", 339 | "subtitle": "Angular", 340 | "meta": "primeng component extension", 341 | "description": "primeng component extension", 342 | "demoUrl": "", 343 | "gitUrl": "https://github.com/giscafer/primeng-ext" 344 | }, 345 | { 346 | "type": [ 347 | "all", 348 | "app" 349 | ], 350 | "img": "gis520", 351 | "title": "GIS520", 352 | "subtitle": "php + H5", 353 | "meta": "大学时期创建GIS520论坛,开发的论坛H5 APP", 354 | "description": "大学时期创建GIS520论坛,开发的论坛H5 APP", 355 | "demoUrl": "http://sj.qq.com/myapp/detail.htm?apkName=com.gis520.www", 356 | "gitUrl": "" 357 | }, 358 | { 359 | "type": [ 360 | "all", 361 | "nodejs" 362 | ], 363 | "img": "3", 364 | "title": "wechat-autoreply", 365 | "subtitle": "wechat + node.js", 366 | "meta": "web 微信关键词自动回复功能(微信聊天,非公众号机器人)", 367 | "description": "web微信!!!非微信公众号,不管是在微信群聊还是微信私聊中,触发关键词,都会出现自动回复", 368 | "gitUrl": "https://github.com/giscafer/wechat-autoreply" 369 | }, 370 | { 371 | "type": [ 372 | "all", 373 | "course" 374 | ], 375 | "img": "live", 376 | "title": "从 giser 到前端开发经理之路", 377 | "subtitle": "学习和工作经验分享", 378 | "meta": "知乎Live", 379 | "description": "WebGIS 开发工程师入门、前端开发工程师入门的一些经验分享与见解,以及结合我的简历和工作经验", 380 | "pptUrl": "https://www.zhihu.com/lives/844909623906549760", 381 | "gitUrl": "" 382 | }, 383 | { 384 | "type": [ 385 | "all", 386 | "course" 387 | ], 388 | "img": "npm", 389 | "title": "node.js npm 模块开发与发布、Mocha自动化测试", 390 | "subtitle": "npm 模块开发培训", 391 | "meta": "线上直播讲堂", 392 | "description": "node.js npm 模块开发与发布、Mocha自动化测试", 393 | "pptUrl": "https://segmentfault.com/l/1500000011901133/", 394 | "gitUrl": "" 395 | }, 396 | { 397 | "type": [ 398 | "all", 399 | "course" 400 | ], 401 | "img": "pwa", 402 | "title": "PWA 技术分享", 403 | "subtitle": "PWA", 404 | "meta": "公司内部技术培训,PWA技术分享PPT&Demo", 405 | "description": "PWA技术学习分享", 406 | "pptUrl": "https://github.com/giscafer/PWA-demo/blob/master/PWA%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB.pptx", 407 | "gitUrl": "https://github.com/giscafer/PWA-demo" 408 | }, 409 | { 410 | "type": [ 411 | "all", 412 | "course" 413 | ], 414 | "img": "webcomponents", 415 | "title": "认识 Web Components", 416 | "subtitle": "Web Components", 417 | "meta": "公司内部前端组培训,Web Components 技术分享PPT&Demo", 418 | "description": "Web Components 技术学习分享", 419 | "pptUrl": "http://yanshuo.io/assets/player/?deck=5b3e1196fe88c20035d21968#/", 420 | "gitUrl": "https://github.com/giscafer/webcomponents-demo" 421 | }, 422 | { 423 | "type": [ 424 | "all", 425 | "course" 426 | ], 427 | "img": "graphql", 428 | "title": "探索 GraphQL", 429 | "subtitle": "GraphQL 技术分享", 430 | "meta": "公司内部技术培训,GraphQL 技术分享 PPT & Demo", 431 | "description": "GraphQL 技术学习分享", 432 | "pptUrl": "https://yanshuo.io/assets/player/?deck=5b65b580ee920a003be3eeb6#/", 433 | "gitUrl": "https://github.com/giscafer/Angular-GraphQL-Express-Demo" 434 | }, 435 | { 436 | "type": [ 437 | "all", 438 | "app" 439 | ], 440 | "img": "rn", 441 | "title": "react-native-apollo-example", 442 | "subtitle": "React Native + GraphQL", 443 | "meta": "A demo for study GraphQL & React Native (server&client)", 444 | "description": "React Native", 445 | "gitUrl": "https://github.com/giscafer/react-native-apollo-example" 446 | }, 447 | { 448 | "type": [ 449 | "all", 450 | "nodejs" 451 | ], 452 | "img": "2", 453 | "title": "orcword", 454 | "subtitle": "nodejs + baidu aip", 455 | "meta": "ORC 识别,支持pdf、图片、已及转word", 456 | "description": "ORC 识别,支持pdf、图片、已及转word", 457 | "gitUrl": "https://github.com/giscafer/orcword" 458 | }, 459 | { 460 | "type": [ 461 | "all", 462 | "angular" 463 | ], 464 | "img": "angular", 465 | "title": "ag-grid-angular-demo", 466 | "subtitle": "angular + ag-Grid + WebSocket + GraphQL", 467 | "meta": "demo list for ag-grid-angular,includes websocket/graphql data binding service", 468 | "description": "demo list for ag-grid-angular,includes websocket/graphql data binding service", 469 | "demoUrl": "http://blog.giscafer.com/ag-grid-angular-demo", 470 | "gitUrl": "https://github.com/giscafer/ag-grid-angular-demo" 471 | }, 472 | { 473 | "type": [ 474 | "all", 475 | "app" 476 | ], 477 | "img": "feweekly", 478 | "title": "前端小助手", 479 | "subtitle": "微信小程序", 480 | "meta": "前端早报、周刊、精选文章资源", 481 | "description": "前端早报、周刊、精选文章资源", 482 | "demoUrl": "https://user-images.githubusercontent.com/8676711/51069422-cee4f780-1669-11e9-937c-33055af05eef.jpg", 483 | "gitUrl": "https://user-images.githubusercontent.com/8676711/51069422-cee4f780-1669-11e9-937c-33055af05eef.jpg" 484 | }, 485 | { 486 | "type": [ 487 | "all", 488 | "course" 489 | ], 490 | "img": "vdom", 491 | "title": "深入认识 Virtual DOM", 492 | "subtitle": "Virtual DOM 技术分享", 493 | "meta": "公司内部技术分享 PPT", 494 | "description": "Virtual DOM 技术学习分享", 495 | "pptUrl": "https://slides.com/giscafer/deck/fullscreen", 496 | "gitUrl": "https://github.com/giscafer/front-end-manual/issues/24" 497 | }, 498 | { 499 | "type": [ 500 | "all", 501 | "course" 502 | ], 503 | "img": "feteam", 504 | "title": "前端团队工程化实践", 505 | "subtitle": "经验总结 技术分享", 506 | "meta": "开发流程规范、项目管理、组件化、前后端协助、CI/CD", 507 | "description": "开发流程规范、项目管理、组件化、前后端协助、CI/CD", 508 | "pptUrl": "https://slides.com/giscafer/deck-2/fullscreen", 509 | "gitUrl": "https://github.com/giscafer/front-end-manual/issues/26" 510 | } 511 | ] 512 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giscafer/project/03f24052b27da6c6bd02edf0ecf2b2e9df0b83d6/src/favicon.ico -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Project 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 108 | 109 | 110 | 111 | 112 | Fork me on GitHub 113 | 114 | 115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 | 127 | 128 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | enableProdMode();//enable the production mode. 6 | 7 | platformBrowserDynamic().bootstrapModule(AppModule); 8 | -------------------------------------------------------------------------------- /src/mock-data/nav-data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by giscafer on 2017/5/13. 3 | */ 4 | 5 | export const NAVS: any = [ 6 | { 7 | "routerUrl": "/all", 8 | "navIcon": "all", 9 | "navText": "All", 10 | "introTitle": "前端编程之路", 11 | "intro": "个人业余在 Github 上开发的部分项目/DEMO,擅长于JavaScript、熟悉Node.js、掌握Java" 12 | }, 13 | { 14 | "routerUrl": "/angular", 15 | "navIcon": "php", 16 | "navText": "Angular", 17 | "introTitle": "Angular 项目", 18 | "intro": "Angular 相关项目、demo" 19 | }, 20 | { 21 | "routerUrl": "/react", 22 | "navIcon": "java", 23 | "navText": "React", 24 | "introTitle": "React 项目", 25 | "intro": "React 相关项目、demo", 26 | }, 27 | { 28 | "routerUrl": "/vue", 29 | "navIcon": "fe", 30 | "navText": "Vue.js", 31 | "introTitle": "Vue.js 项目", 32 | "intro": "vue.js相关项目、demo" 33 | }, 34 | { 35 | "routerUrl": "/nodejs", 36 | "navIcon": "ios", 37 | "navText": "Node.js", 38 | "introTitle": "Node.js 项目", 39 | "intro": "Node.js 相关项目、demo、NPM插件", 40 | }, 41 | { 42 | "routerUrl": "/app", 43 | "navIcon": "android", 44 | "navText": "App", 45 | "introTitle": "App 项目", 46 | "intro": "App 相关项目/Demo。掌握技术有:Ionic、NativeScript、React Native" 47 | }, 48 | { 49 | "routerUrl": "/other", 50 | "navIcon": "fe", 51 | "navText": "Other", 52 | "introTitle": "其他项目", 53 | "intro": "微信公众号/微信小程序开发、Java开发、其他非框架技术开发Demo" 54 | }, 55 | { 56 | "routerUrl": "/course", 57 | "navIcon": "course", 58 | "navText": "Course", 59 | "introTitle": "培训、分享课程", 60 | "intro": "个人在线上/线下/公司内部,所进行过的培训/分享的技术课程" 61 | } 62 | ]; 63 | -------------------------------------------------------------------------------- /src/mock-data/project-data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by giscafer on 2017/5/13. 3 | */ 4 | 5 | export const PROJECTS: any = [ 6 | { 7 | "type": ['all', 'vue', 'nodejs'], 8 | "img": "1", 9 | "title": "Ponitor", 10 | "subtitle": "Vue.js1.x • ES6 • Node.js • MongoDB", 11 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 12 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件), 商品价格趋势分析统计等!", 13 | "demoUrl": "http://project.xinong.wang:18080/", 14 | "gitUrl": "https://github.com/giscafer/Ponitor", 15 | }, 16 | { 17 | "type": ['all', 'react'], 18 | "img": "2", 19 | "title": "react-ponitor", 20 | "subtitle": "react • react-redux", 21 | "meta": " [ P ] rice + M [ onitor ] = Ponitor 价格监测应用", 22 | "description": "天猫、淘宝、京东、Apple App的商品,监控商品价格发生变动时(每天定时器),推送消息(目前是发送邮件),商品价格趋势分析统计等!", 23 | "demoUrl": "https://giscafer.github.io/react-ponitor/", 24 | "gitUrl": "https://github.com/giscafer/react-ponitor", 25 | }, { 26 | "type": ['all', 'other', 'java'], 27 | "img": "3", 28 | "title": "FinalScheduler", 29 | "subtitle": "JFinal2.0 • Bootstrap • SeaJS • FullCalender.js", 30 | "meta": "终极排班管理系统,灵活排班", 31 | "description": "终极排班管理系统,改变传统的排班模式!", 32 | "demoUrl": "", 33 | "gitUrl": "https://github.com/giscafer/FinalScheduler", 34 | }, { 35 | "type": ['all', 'other', 'css'], 36 | "img": "4", 37 | "title": "hexo-theme-cafe", 38 | "subtitle": "HTML • CSS • Hexo", 39 | "meta": "自定义 Hexo 博客框架主题,追求简约、操作简单、阅读舒适度", 40 | "description": "A theme of Hexo that is aimed at pursuit of simplicity, simple operation, reading comfort. 追求简约、操作简单、阅读舒适度", 41 | "demoUrl": "http://blog.giscafer.com/", 42 | "gitUrl": "https://github.com/giscafer/hexo-theme-cafe", 43 | }, { 44 | "type": ['all', 'other', 'wechat'], 45 | "img": "6", 46 | "title": "mapshaper-plus", 47 | "subtitle": "HTML • CSS • JavaScript", 48 | "meta": "Generate geojson files for Echarts Map,base on mapshaper", 49 | "description": "基于mapshaper对geojson地图数据的坐标信息进行压缩编码,并提供可直接生成压缩编码后的echarts map数据格式," + 50 | "通过mapshaper-plus可以直接将shp格式数据转换为压缩后的echarts数据", 51 | "demoUrl": "https://giscafer.github.io/mapshaper-plus/", 52 | "gitUrl": "https://github.com/giscafer/mapshaper-plus", 53 | }, { 54 | "type": ['all', 'other', 'wechat'], 55 | "img": "5", 56 | "title": "wechat-weapp-mapdemo", 57 | "subtitle": "HTML5 • CSS • JavaScript", 58 | "meta": "微信小程序开发demo,地图导航、marker标注", 59 | "description": "微信小程序开发demo,地图导航、marker标注", 60 | "demoUrl": "", 61 | "gitUrl": "https://github.com/giscafer/wechat-weapp-mapdemo", 62 | }, { 63 | "type": ['all', 'angular', 'nodejs'], 64 | "img": "7", 65 | "title": "angular-chat", 66 | "subtitle": "Angular4 • Node.js • Socket.io", 67 | "meta": "(IM App)Chat App built using Angular and Socket.io", 68 | "description": "(IM App)Chat App built using Angular and Socket.io,模仿百度E秘聊天", 69 | "demoUrl": "http://project.xinong.wang:8080/", 70 | "gitUrl": "https://github.com/giscafer/angular-chat", 71 | }, { 72 | "type": ['all', 'react'], 73 | "img": "8", 74 | "title": "ife-course-demo", 75 | "subtitle": "react", 76 | "meta": "百度前端技术学院demo演示SPA ", 77 | "description": "百度前端技术学院demo演示SPA ", 78 | "demoUrl": "http://ife.giscafer.com", 79 | "gitUrl": "https://github.com/giscafer/ife-course-demo", 80 | }, { 81 | "type": ['all', 'angular'], 82 | "img": "9", 83 | "title": "ng2-ife-course", 84 | "subtitle": "angular2", 85 | "meta": "百度前端技术学院demo演示SPA ", 86 | "description": "百度前端技术学院demo演示SPA ", 87 | "demoUrl": "http://ng2ife.giscafer.com", 88 | "gitUrl": "https://github.com/giscafer/ng2-ife-course", 89 | }, { 90 | "type": ['all', 'nodejs'], 91 | "img": "10", 92 | "title": "moviesite", 93 | "subtitle": "Node.js • Jade • MongoDB", 94 | "meta": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,网站爬虫添加,电影查询删除等", 95 | "description": "学习nodejs时,开发的一个电影网站demo,功能包括注册登录,爬虫添加电影,电影查询删除等", 96 | "demoUrl": "", 97 | "gitUrl": "https://github.com/giscafer/moviesite", 98 | }, { 99 | "type": ['all', 'other', 'wechat', 'java'], 100 | "img": "11", 101 | "title": "gisrobot", 102 | "subtitle": "Java • 微信公众号", 103 | "meta": " 微信公众号JAVA开发学习demo,天气预报查询、消息自动回复、中英文翻译", 104 | "description": "微信公众号开发机器人,天气预报查询、消息自动回复、中英文翻译", 105 | "demoUrl": "", 106 | "gitUrl": "https://github.com/giscafer/gisrobot", 107 | }, { 108 | "type": ['all', 'react'], 109 | "img": "1", 110 | "title": "react-demo-list", 111 | "subtitle": "react", 112 | "meta": " react学习练习demo", 113 | "description": " react学习练习demo", 114 | "demoUrl": "https://giscafer.github.io/react-demo-list/", 115 | "gitUrl": "https://github.com/giscafer/react-demo-list", 116 | }, { 117 | "type": ['all', 'vue', 'nodejs'], 118 | "img": "2", 119 | "title": "Vue-order", 120 | "subtitle": "vue.js1.x • Node.js • MongoDB", 121 | "meta": " nodejs+vue.js学习开发demo,订餐系统应用 ", 122 | "description": "nodejs+vue.js学习开发demo,订餐系统应用", 123 | "demoUrl": "", 124 | "gitUrl": "https://github.com/giscafer/Vue-order", 125 | }, { 126 | "type": ['all', 'nodejs', 'npm'], 127 | "img": "3", 128 | "title": "alidayujs", 129 | "subtitle": "NPM • Node.js", 130 | "meta": "阿里大鱼短信SDK( JavaScript Alidayu SDK)封装成npm插件", 131 | "description": "JavaScript Alidayu SDK 兼容服务器端环境node.js,模块加载器如RequireJS和所有浏览器", 132 | "npm": "https://www.npmjs.com/package/alidayujs", 133 | "demoUrl": "", 134 | "gitUrl": "https://github.com/giscafer/alidayujs", 135 | }, { 136 | "type": ['all', 'nodejs', 'npm'], 137 | "img": "3", 138 | "title": "node-ipcity", 139 | "subtitle": "NPM • Node.js", 140 | "meta": "Get ip city info 获取ip归属城市信息 | NPM插件", 141 | "description": "get ip city info 获取ip归属城市信息", 142 | "npm": "https://www.npmjs.com/package/node-ipcity", 143 | "demoUrl": "", 144 | "gitUrl": "https://github.com/giscafer/node-ipcity", 145 | }, { 146 | "type": ['all', 'nodejs', 'npm'], 147 | "img": "3", 148 | "title": "node-typhoon", 149 | "subtitle": "NPM • Node.js", 150 | "meta": "Help you get the typhoon information 台风信息查询Api | NPM插件", 151 | "description": "Help you get the typhoon information 台风信息查询Api", 152 | "npm": "https://www.npmjs.com/package/node-typhoon", 153 | "demoUrl": "", 154 | "gitUrl": "https://github.com/giscafer/node-typhoon", 155 | }, { 156 | "type": ['all', 'nodejs', 'angular'], 157 | "img": "5", 158 | "title": "git-batch-file-builder", 159 | "subtitle": "angular1.x • Git • Node.js", 160 | "meta": "Git Batch File Builder,git批处理文件创建", 161 | "description": "Git Batch File Builder,git批处理文件创建", 162 | "demoUrl": "", 163 | "gitUrl": "https://github.com/giscafer/git-batch-file-builder", 164 | }, { 165 | "type": ['all', 'nodejs', 'other'], 166 | "img": "6", 167 | "title": "generate-form-by-table-structure", 168 | "subtitle": "Node.js", 169 | "meta": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 170 | "description": "Generate the form html template according to the table structure(根据表结构自动生成表单)", 171 | "demoUrl": "", 172 | "gitUrl": "https://github.com/giscafer/generate-form-by-table-structure", 173 | }, { 174 | "type": ['all', 'other', 'java'], 175 | "img": "7", 176 | "title": "physicaltable", 177 | "subtitle": "Java • BootStrap", 178 | "meta": "一个关于体育成绩登记的简单站点", 179 | "description": "一个关于体育成绩登记的简单站点", 180 | "demoUrl": "", 181 | "gitUrl": "https://github.com/giscafer/physicaltable", 182 | }, { 183 | "type": ['all', 'angular'], 184 | "img": "8", 185 | "title": "angular-webuploader", 186 | "subtitle": "angular1.x • webuploader", 187 | "meta": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 188 | "description": "An AngularJS directive for webuploader (angular指令封装的webuploader demo,弹窗上传图片,缩略图展示列表,翻页效果;支持点击缩略图查看大图详情)", 189 | "demoUrl": "", 190 | "gitUrl": "https://github.com/giscafer/angular-webuploader", 191 | }, { 192 | "type": ['all', 'angular'], 193 | "img": "9", 194 | "title": "laoui-bootstrap", 195 | "subtitle": "angular1.x • bootstrap", 196 | "meta": "基于bootstrap与angularjs1.x的UI组件封装", 197 | "description": "基于bootstrap与angularjs1.x的UI组件", 198 | "demoUrl": "http://laoui.giscafer.com", 199 | "gitUrl": "", 200 | }, { 201 | "type": ['all', 'angular'], 202 | "img": "3", 203 | "title": "ng-ace-tern", 204 | "subtitle": "NPM • Angular", 205 | "meta": "Tern plugin for Ace Editor for Angular", 206 | "description": "Tern plugin for Ace Editor for Angular", 207 | "npm": "https://www.npmjs.com/package/ng-ace-tern", 208 | "demoUrl": "", 209 | "gitUrl": "https://github.com/giscafer/ng-ace-tern", 210 | }, { 211 | "type": ['all', 'angular'], 212 | "img": "7", 213 | "title": "ng-form-builder", 214 | "subtitle": "Angular", 215 | "meta": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 216 | "description": "Angular form generation,dynamic template support primeng/zorro/bootstrap UI", 217 | "demoUrl": "form.giscafer.com", 218 | "gitUrl": "https://github.com/giscafer/ng-form-builder", 219 | }, { 220 | "type": ['all', 'angular'], 221 | "img": "6", 222 | "title": "ng-viewer", 223 | "subtitle": "Angular", 224 | "meta": "An angular directive for viewer.js", 225 | "description": "An angular directive for viewer.js", 226 | "demoUrl": "", 227 | "gitUrl": "https://github.com/giscafer/ng-viewer", 228 | }, { 229 | "type": ['all', 'angular'], 230 | "img": "4", 231 | "title": "primeng-ext", 232 | "subtitle": "Angular", 233 | "meta": "primeng component extension", 234 | "description": "primeng component extension", 235 | "demoUrl": "", 236 | "gitUrl": "https://github.com/giscafer/primeng-ext", 237 | }, { 238 | "type": ['all', 'app'], 239 | "img": "gis520", 240 | "title": "GIS520", 241 | "subtitle": "php + H5", 242 | "meta": "大学时期创建GIS520论坛,开发的论坛H5 APP", 243 | "description": "大学时期创建GIS520论坛,开发的论坛H5 APP", 244 | "demoUrl": "http://sj.qq.com/myapp/detail.htm?apkName=com.gis520.www", 245 | "gitUrl": "", 246 | } 247 | ]; 248 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/set'; 35 | 36 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 37 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 38 | 39 | /** IE10 and IE11 requires the following to support `@angular/animation`. */ 40 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 41 | 42 | 43 | /** Evergreen browsers require these. **/ 44 | import 'core-js/es6/reflect'; 45 | import 'core-js/es7/reflect'; 46 | 47 | 48 | /** ALL Firefox browsers require the following to support `@angular/animation`. **/ 49 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 50 | 51 | 52 | 53 | /*************************************************************************************************** 54 | * Zone JS is required by Angular itself. 55 | */ 56 | import 'zone.js/dist/zone'; // Included with Angular CLI. 57 | 58 | 59 | 60 | /*************************************************************************************************** 61 | * APPLICATION IMPORTS 62 | */ 63 | 64 | /** 65 | * Date, currency, decimal and percent pipes. 66 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 67 | */ 68 | // import 'intl'; // Run `npm install --save intl`. 69 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/long-stack-trace-zone'; 4 | import 'zone.js/dist/proxy.js'; 5 | import 'zone.js/dist/sync-test'; 6 | import 'zone.js/dist/jasmine-patch'; 7 | import 'zone.js/dist/async-test'; 8 | import 'zone.js/dist/fake-async-test'; 9 | import { getTestBed } from '@angular/core/testing'; 10 | import { 11 | BrowserDynamicTestingModule, 12 | platformBrowserDynamicTesting 13 | } from '@angular/platform-browser-dynamic/testing'; 14 | 15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 16 | declare var __karma__: any; 17 | declare var require: any; 18 | 19 | // Prevent Karma from running prematurely. 20 | __karma__.loaded = function () {}; 21 | 22 | // First, initialize the Angular testing environment. 23 | getTestBed().initTestEnvironment( 24 | BrowserDynamicTestingModule, 25 | platformBrowserDynamicTesting() 26 | ); 27 | // Then we find all the tests. 28 | const context = require.context('./', true, /\.spec\.ts$/); 29 | // And load the modules. 30 | context.keys().map(context); 31 | // Finally, start Karma to run the tests. 32 | __karma__.start(); 33 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "es2015", 6 | "baseUrl": "", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "baseUrl": "", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | }, 13 | "files": [ 14 | "test.ts" 15 | ], 16 | "include": [ 17 | "**/*.spec.ts", 18 | "**/*.d.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "baseUrl": "src", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "moduleResolution": "node", 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2016", 17 | "dom" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "callable-types": true, 7 | "class-name": true, 8 | "comment-format": [ 9 | true, 10 | "check-space" 11 | ], 12 | "curly": true, 13 | "eofline": true, 14 | "forin": true, 15 | "import-blacklist": [true, "rxjs"], 16 | "import-spacing": true, 17 | "indent": [ 18 | true, 19 | "spaces" 20 | ], 21 | "interface-over-type-literal": true, 22 | "label-position": true, 23 | "max-line-length": [ 24 | true, 25 | 140 26 | ], 27 | "member-access": false, 28 | "member-ordering": [ 29 | true, 30 | "static-before-instance", 31 | "variables-before-functions" 32 | ], 33 | "no-arg": true, 34 | "no-bitwise": true, 35 | "no-console": [ 36 | true, 37 | "debug", 38 | "info", 39 | "time", 40 | "timeEnd", 41 | "trace" 42 | ], 43 | "no-construct": true, 44 | "no-debugger": true, 45 | "no-duplicate-variable": true, 46 | "no-empty": false, 47 | "no-empty-interface": true, 48 | "no-eval": true, 49 | "no-inferrable-types": [true, "ignore-params"], 50 | "no-shadowed-variable": true, 51 | "no-string-literal": false, 52 | "no-string-throw": true, 53 | "no-switch-case-fall-through": true, 54 | "no-trailing-whitespace": true, 55 | "no-unused-expression": true, 56 | "no-use-before-declare": true, 57 | "no-var-keyword": true, 58 | "object-literal-sort-keys": false, 59 | "one-line": [ 60 | true, 61 | "check-open-brace", 62 | "check-catch", 63 | "check-else", 64 | "check-whitespace" 65 | ], 66 | "prefer-const": true, 67 | "quotemark": [ 68 | true, 69 | "single" 70 | ], 71 | "radix": true, 72 | "semicolon": [ 73 | "always" 74 | ], 75 | "triple-equals": [ 76 | true, 77 | "allow-null-check" 78 | ], 79 | "typedef-whitespace": [ 80 | true, 81 | { 82 | "call-signature": "nospace", 83 | "index-signature": "nospace", 84 | "parameter": "nospace", 85 | "property-declaration": "nospace", 86 | "variable-declaration": "nospace" 87 | } 88 | ], 89 | "typeof-compare": true, 90 | "unified-signatures": true, 91 | "variable-name": false, 92 | "whitespace": [ 93 | true, 94 | "check-branch", 95 | "check-decl", 96 | "check-operator", 97 | "check-separator", 98 | "check-type" 99 | ], 100 | 101 | "directive-selector": [true, "attribute", "app", "camelCase"], 102 | "component-selector": [true, "element", "app", "kebab-case"], 103 | "use-input-property-decorator": true, 104 | "use-output-property-decorator": true, 105 | "use-host-property-decorator": true, 106 | "no-input-rename": true, 107 | "no-output-rename": true, 108 | "use-life-cycle-interface": true, 109 | "use-pipe-transform-interface": true, 110 | "component-class-suffix": true, 111 | "directive-class-suffix": true, 112 | "no-access-missing-member": true, 113 | "templates-use-public": true, 114 | "invoke-injectable": true 115 | } 116 | } 117 | --------------------------------------------------------------------------------