├── .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 | 
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 |
Project
--------------------------------------------------------------------------------
/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/mgAADUZJREFUeNrsnQuQFMUZ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)}.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 |
9 |
--------------------------------------------------------------------------------
/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 |
4 |
5 |
{{firstNav.introTitle}}
6 |
7 | {{firstNav.intro}}
8 |
9 |
10 |
11 |
{{nav.introTitle}}
12 |
{{nav.intro}}
13 |
14 |
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 |
9 |
{{item.title}}
10 |
11 | {{item.subtitle}}
12 |
13 |
{{item.meta}}
14 |
15 |
20 |
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 |
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 |
--------------------------------------------------------------------------------