├── src
├── global.less
├── pages
│ ├── .umi
│ │ ├── polyfills.js
│ │ ├── initHistory.js
│ │ ├── umi.js
│ │ └── router.js
│ ├── index.css
│ └── index.js
└── Home
│ ├── less
│ ├── edit.less
│ ├── antMotionStyle.less
│ ├── common.less
│ ├── custom.less
│ ├── content.less
│ ├── content0.less
│ ├── content11.less
│ ├── content3.less
│ ├── footer1.less
│ ├── content1.less
│ ├── banner0.less
│ └── nav0.less
│ ├── Content11.jsx
│ ├── Banner0.jsx
│ ├── Footer1.jsx
│ ├── Content1.jsx
│ ├── Content0.jsx
│ ├── Nav0.jsx
│ ├── index.jsx
│ ├── Content3.jsx
│ └── data.source.js
├── logo.png
├── .umirc.js
├── .gitignore
├── README.md
├── index.html
└── package.json
/src/global.less:
--------------------------------------------------------------------------------
1 | @import './Home/less/antMotionStyle.less';
2 |
--------------------------------------------------------------------------------
/src/pages/.umi/polyfills.js:
--------------------------------------------------------------------------------
1 | import '@babel/polyfill';
2 |
3 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Exrick/xboot-show/HEAD/logo.png
--------------------------------------------------------------------------------
/src/pages/index.css:
--------------------------------------------------------------------------------
1 |
2 | .normal {
3 | background: #C6F279;
4 | }
5 |
--------------------------------------------------------------------------------
/src/pages/index.js:
--------------------------------------------------------------------------------
1 | import Home from '../Home';
2 |
3 | export default function () {
4 | return (
5 |
6 | );
7 | }
8 |
--------------------------------------------------------------------------------
/src/pages/.umi/initHistory.js:
--------------------------------------------------------------------------------
1 | // create history
2 | window.g_history = require('umi/_createHistory').default({
3 | basename: window.routerBase,
4 | });
5 |
--------------------------------------------------------------------------------
/.umirc.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: [
3 | [
4 | 'umi-plugin-react', {
5 | antd: true,
6 | }
7 | ],
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/src/Home/less/edit.less:
--------------------------------------------------------------------------------
1 | .banner-anim-elem > .banner1-text-wrapper > .jtnsptxmynl-editor_css {
2 | width: 550px;
3 | }
4 | .banner0 > .banner0-text-wrapper > .jtnstd5q52-editor_css {
5 | width: 300px;
6 | min-height: 180px;
7 | }
8 | .banner0 > .banner0-text-wrapper > .jtntac62itf-editor_css {
9 | text-decoration: none;
10 | }
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | .DS_Store
3 | node_modules
4 | /dist
5 | package-lock.json
6 | xb
7 |
8 | # local env files
9 | .env.local
10 | .env.*.local
11 |
12 | # Log files
13 | npm-debug.log*
14 | yarn-debug.log*
15 | yarn-error.log*
16 |
17 | # Editor directories and files
18 | .idea
19 | .vscode
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw*
--------------------------------------------------------------------------------
/src/Home/less/antMotionStyle.less:
--------------------------------------------------------------------------------
1 | @import './common.less';
2 | @import './custom.less';
3 | @import './content.less';
4 | @import './nav0.less';
5 | @import './banner0.less';
6 | @import './content0.less';
7 | @import './content3.less';
8 | @import './content1.less';
9 | @import './content11.less';
10 | @import './footer1.less';
11 | @import './edit.less';
--------------------------------------------------------------------------------
/src/Home/less/common.less:
--------------------------------------------------------------------------------
1 |
2 | @import "~antd/lib/style/v2-compatible-reset.less";
3 |
4 | body {
5 | word-wrap: break-word;
6 | }
7 |
8 | /* .content-wrapper > .tween-one-leaving,
9 | .queue-anim-leaving {
10 | // position: absolute !important;
11 | // width: 100%;
12 | } */
13 |
14 | .video {
15 | max-width: 800px;
16 | }
17 |
18 | #react-content {
19 | min-height: 100%;
20 | }
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [XBoot宣传官网](http://xb.exrick.cn)
2 | - 官网地址:http://xb.exrick.cn/
3 | - 使用 [阿里 Ant Design Landing](https://landing.ant.design/index-cn) 编辑开发
4 | - 基于脚手架 [umi](https://landing.ant.design/docs/use/umi) 创建
5 |
6 | 
7 |
8 | ### 本地开发运行
9 | - npm install --save umi
10 | - npm i
11 | - umi dev
12 | - 默认端口8000
13 | ### 打包部署
14 | - umi build
15 |
--------------------------------------------------------------------------------
/src/Home/less/custom.less:
--------------------------------------------------------------------------------
1 | @import "~antd/lib/style/themes/default.less";
2 |
3 | @line-color: #e9e9e9;
4 |
5 | @shadow-color: rgba(0, 0, 0, 0.15);
6 |
7 | @bottom-bar-bg-color: #262626;
8 | @bottom-bar-line-color: #000;
9 |
10 | @template-bg-color: #001529;
11 | @template-bg-color-light: #ececec;
12 | @template-nav-bg-color: fade(@template-bg-color, 95%);
13 | @template-text-color: #ccc;
14 | @template-text-title-color: #bcbcbc;
15 | @template-text-color-light: #fff;
16 | @template-footer-text-color: #999;
17 |
18 | @animate-duration: .45s;
19 |
20 | /* 详细页图片或框框的样式;
21 | */
22 | .page-shadow() {
23 | box-shadow: 0 5px 8px @shadow-color;
24 | }
25 |
26 | .page-pro() {
27 | border-radius: 6px;
28 | border: 1px solid @line-color;
29 | transform: translateY(0);
30 | transition: transform .3s @ease-out, box-shadow .3s @ease-out;
31 | &:hover {
32 | .page-shadow();
33 | transform: translateY(-5px);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/Home/less/content.less:
--------------------------------------------------------------------------------
1 | @homepage: home-page;
2 | .@{homepage}-wrapper {
3 | width: 100%;
4 | position: relative;
5 | overflow: hidden;
6 | .@{homepage} {
7 | height: 100%;
8 | max-width: 1200px;
9 | position: relative;
10 | margin: auto;
11 | will-change: transform;
12 | }
13 | .title-wrapper > h1, > h1 {
14 | font-size: 32px;
15 | color: @text-color;
16 | margin-bottom: 16px;
17 | }
18 | .title-wrapper {
19 | margin: 0 auto 64px;
20 | text-align: center;
21 | }
22 | }
23 |
24 | .@{homepage} {
25 | padding: 128px 24px;
26 | }
27 |
28 | @media screen and (max-width: 767px) {
29 | .@{homepage}-wrapper {
30 | .@{homepage} {
31 | padding: 56px 24px;
32 | >h1 {
33 | font-size: 24px;
34 | margin: 0 auto 32px;
35 | &.title-h1 {
36 | margin-bottom: 8px;
37 | }
38 | }
39 | >p {
40 | margin-bottom: 32px;
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/pages/.umi/umi.js:
--------------------------------------------------------------------------------
1 | import './polyfills';
2 |
3 | import '@tmp/initHistory';
4 | import React from 'react';
5 | import ReactDOM from 'react-dom';
6 |
7 |
8 | // runtime plugins
9 | window.g_plugins = require('umi/_runtimePlugin');
10 | window.g_plugins.init({
11 | validKeys: ['patchRoutes','render','rootContainer','modifyRouteProps','onRouteChange',],
12 | });
13 |
14 |
15 |
16 | // render
17 | let oldRender = () => {
18 | const rootContainer = window.g_plugins.apply('rootContainer', {
19 | initialValue: React.createElement(require('./router').default),
20 | });
21 | ReactDOM.render(
22 | rootContainer,
23 | document.getElementById('root'),
24 | );
25 | };
26 | const render = window.g_plugins.compose('render', { initialValue: oldRender });
27 |
28 | const moduleBeforeRendererPromises = [];
29 |
30 | Promise.all(moduleBeforeRendererPromises).then(() => {
31 | render();
32 | }).catch((err) => {
33 | window.console && window.console.error(err);
34 | });
35 |
36 | require('../../global.less');
37 |
38 | // hot module replacement
39 | if (module.hot) {
40 | module.hot.accept('./router', () => {
41 | oldRender();
42 | });
43 | }
44 |
--------------------------------------------------------------------------------
/src/Home/less/content0.less:
--------------------------------------------------------------------------------
1 | @content0: content0;
2 | .@{content0}-wrapper {
3 | height: 446px;
4 | overflow: hidden;
5 | .@{content0} {
6 | overflow: hidden;
7 | height: 100%;
8 | padding: 64px 24px;
9 | > .title-wrapper {
10 | margin: 0 auto 48px;
11 | }
12 | .block-wrapper {
13 | position: relative;
14 | height: 100%;
15 | overflow: hidden;
16 | top: 25%;
17 | padding: 20px 0;
18 | .block {
19 | padding: 0 4%;
20 | display: inline-block;
21 | text-align: center;
22 | height: 200px;
23 | margin-bottom: 48px;
24 | &.queue-anim-leaving {
25 | position: relative !important;
26 | }
27 | .icon {
28 | width: 100px;
29 | height: 100px;
30 | margin: auto;
31 | display: flex;
32 | align-items: center;
33 | }
34 | .@{content0}-title {
35 | line-height: 32px;
36 | margin: 10px auto;
37 | }
38 | }
39 | }
40 | }
41 | }
42 |
43 | @media screen and (max-width: 767px) {
44 | .@{content0}-wrapper {
45 | height: 880px;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/Home/less/content11.less:
--------------------------------------------------------------------------------
1 | @content11: content11;
2 | .@{content11}-wrapper {
3 | height: 480px;
4 | background: url("https://gw.alipayobjects.com/zos/rmsportal/ZsWYzLOItgeaWDSsXdZd.svg") no-repeat bottom;
5 | background-size: cover;
6 | background-size: 100%;
7 | margin: 0 auto;
8 | overflow: hidden;
9 | padding-top: 96px;
10 | &.home-page-wrapper {
11 | .title-wrapper {
12 | margin-bottom: 32px;
13 | }
14 | }
15 | .button {
16 | box-shadow: 0 8px 16px #0554b7;
17 | background: linear-gradient(to right, #05cbff, #1e5aff) !important;
18 | height: 42px;
19 | line-height: 42px;
20 | font-size: 14px;
21 | border: 0;
22 | border-radius: 21px;
23 | color: #fff;
24 | width: 128px;
25 | padding: 0 15px;
26 | display: inline-block;
27 | transition: transform .3s, box-shadow .3s;
28 | &:hover {
29 | transform: translateY(-4px);
30 | box-shadow: 0 12px 20px #0554b7;
31 | }
32 | &:active {
33 | transform: translateY(4px);
34 | box-shadow: 0 4px 8px #0554b7;
35 | }
36 | }
37 | .title-content {
38 | line-height: 32px;
39 | }
40 | }
41 |
42 | @media screen and (max-width: 767px) {
43 | .@{content11}-wrapper {
44 | padding-bottom: 0;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/pages/.umi/router.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Router as DefaultRouter, Route, Switch } from 'react-router-dom';
3 | import dynamic from 'umi/dynamic';
4 | import renderRoutes from 'umi/_renderRoutes';
5 |
6 |
7 | let Router = DefaultRouter;
8 |
9 | let routes = [
10 | {
11 | "path": "/",
12 | "exact": true,
13 | "component": require('../index.js').default
14 | },
15 | {
16 | "component": () => React.createElement(require('/usr/local/lib/node_modules/umi/node_modules/_umi-build-dev@1.7.5@umi-build-dev/lib/plugins/404/NotFound.js').default, { pagesPath: 'src/pages', hasRoutesInConfig: false })
17 | }
18 | ];
19 | window.g_routes = routes;
20 | window.g_plugins.applyForEach('patchRoutes', { initialValue: routes });
21 |
22 | // route change handler
23 | function routeChangeHandler(location, action) {
24 | window.g_plugins.applyForEach('onRouteChange', {
25 | initialValue: {
26 | routes,
27 | location,
28 | action,
29 | },
30 | });
31 | }
32 | window.g_history.listen(routeChangeHandler);
33 | routeChangeHandler(window.g_history.location);
34 |
35 | export default function RouterWrapper() {
36 | return (
37 |
38 | { renderRoutes(routes, {}) }
39 |
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | XBoot前后端分离开发平台springboot 2.x iview 前后端分离_vue_集成activiti工作流 iview admin 动态数据权限 权限按钮显示 spring security
10 | elasticsearch 分布式限流_同步锁
11 |
13 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
31 |
32 |
--------------------------------------------------------------------------------
/src/Home/less/content3.less:
--------------------------------------------------------------------------------
1 | @content3: content3;
2 | .@{content3}-wrapper {
3 | min-height: 764px;
4 | .@{content3} {
5 | height: 100%;
6 | overflow: hidden;
7 | & .title-content {
8 | text-align: center;
9 | }
10 | &-block-wrapper {
11 | position: relative;
12 | .@{content3}-block {
13 | display: inline-block;
14 | padding: 48px 24px;
15 | vertical-align: top;
16 | .@{content3}-icon {
17 | display: inline-block;
18 | width: 15%;
19 | vertical-align: top;
20 | }
21 | .@{content3}-text {
22 | width: 85%;
23 | display: inline-block;
24 | padding-left: 8%;
25 | }
26 | &.clear-both {
27 | clear: both;
28 | }
29 | }
30 | }
31 | }
32 | }
33 |
34 | @media screen and (max-width: 767px) {
35 | .@{content3}-wrapper {
36 | min-height: 1080px;
37 | .@{content3} {
38 | &-block-wrapper {
39 | margin: 20px auto;
40 | height: auto;
41 | .@{content3}-block {
42 | .@{content3}-title {
43 | font-size: 20px;
44 | }
45 | &.queue-anim-leaving {
46 | position: relative !important;
47 | }
48 | }
49 | }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "landing-test",
3 | "private": true,
4 | "scripts": {
5 | "start": "umi dev",
6 | "build": "umi build",
7 | "lint": "eslint --ext .jsx src && tnpm run lint:style",
8 | "lint:style": "stylelint \"src/Home/**/*.less\" --syntax less"
9 | },
10 | "dependencies": {
11 | "antd": "^3.10.3",
12 | "enquire-js": "^0.2.1",
13 | "rc-banner-anim": "^2.1.0",
14 | "rc-queue-anim": "^1.6.7",
15 | "rc-scroll-anim": "^2.5.6",
16 | "rc-texty": "^0.2.0",
17 | "rc-tween-one": "^2.2.14",
18 | "react-sublime-video": "^0.2.5",
19 | "react": "^16.6.0",
20 | "react-dom": "^16.6.0"
21 | },
22 | "devDependencies": {
23 | "babel-eslint": "^10.0.1",
24 | "eslint": "^4.9.0",
25 | "eslint-config-airbnb": "latest",
26 | "eslint-loader": "^1.9.0",
27 | "eslint-plugin-babel": "^4.1.2",
28 | "eslint-plugin-compat": "^2.2.0",
29 | "eslint-plugin-import": "^2.7.0",
30 | "eslint-plugin-jsx-a11y": "^6.0.2",
31 | "eslint-plugin-markdown": "^1.0.0-beta.6",
32 | "eslint-plugin-react": "^7.4.0",
33 | "eslint-tinker": "^0.4.1",
34 | "pre-commit": "1.x",
35 | "stylelint": "^9.4.0",
36 | "stylelint-config-prettier": "^4.0.0",
37 | "stylelint-config-standard": "^18.0.0",
38 | "umi-plugin-react": "^1.2.0"
39 | },
40 | "pre-commit": [
41 | "lint"
42 | ]
43 | }
44 |
--------------------------------------------------------------------------------
/src/Home/Content11.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
3 | import QueueAnim from 'rc-queue-anim';
4 | import TweenOne from 'rc-tween-one';
5 |
6 | class Content11 extends React.PureComponent {
7 | render() {
8 | const { ...props } = this.props;
9 | const { dataSource } = props;
10 | delete props.dataSource;
11 | delete props.isMobile;
12 | return (
13 |
14 |
21 | {dataSource.titleWrapper.children.map((item, i) =>
22 | React.createElement(
23 | item.name.indexOf('title') === 0 ? 'h1' : 'div',
24 | { key: i.toString(), ...item },
25 | typeof item.children === 'string' &&
26 | item.children.match(/\.(svg|gif|jpg|jpeg|png|JPG|PNG|GIF|JPEG)$/)
27 | ? React.createElement('img', { src: item.children, alt: 'img' })
28 | : item.children
29 | )
30 | )}
31 |
32 |
38 |
39 | {dataSource.button.children.a.children}
40 |
41 |
42 |
43 | );
44 | }
45 | }
46 |
47 | export default Content11;
48 |
--------------------------------------------------------------------------------
/src/Home/less/footer1.less:
--------------------------------------------------------------------------------
1 | .footer1-wrapper {
2 | background: @template-bg-color;
3 | overflow: hidden;
4 | position: relative;
5 | min-height: 400px;
6 | color: @template-footer-text-color;
7 | .footer1 {
8 | .home-page {
9 | padding: 64px 24px 80px;
10 | }
11 | .block {
12 | padding: 0 32px;
13 | .logo {
14 | max-width: 180px;
15 | }
16 | .slogan {
17 | font-size: 12px;
18 | margin-top: -20px;
19 | }
20 | >h2 {
21 | margin-bottom: 24px;
22 | color: @template-text-color;
23 | }
24 | >div {
25 | line-height: 24px;
26 | a {
27 | color: @template-footer-text-color;
28 | &:hover {
29 | color: @primary-color;
30 | }
31 | }
32 | }
33 | }
34 | }
35 | .copyright-wrapper {
36 | width: 100%;
37 | border-top: 1px solid fade(@line-color, 10);
38 | .home-page {
39 | padding: 0 24px;
40 | overflow: hidden;
41 | }
42 | .copyright {
43 | height: 100px;
44 | text-align: right;
45 | line-height: 80px;
46 | float: right;
47 | }
48 | }
49 | }
50 |
51 | @media screen and (max-width: 767px) {
52 | .footer1 {
53 | height: 550px;
54 | >ul {
55 | width: 90%;
56 | margin: 20px auto 0;
57 | padding: 10px 0;
58 | >li {
59 | width: 100%;
60 | h2 {
61 | margin-bottom: 10px;
62 | }
63 | li {
64 | display: inline-block;
65 | margin-right: 10px;
66 | }
67 | }
68 | }
69 | .copyright {
70 | span {
71 | width: 90%;
72 | }
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/src/Home/Banner0.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Button, Icon } from 'antd';
3 | import QueueAnim from 'rc-queue-anim';
4 | import TweenOne from 'rc-tween-one';
5 |
6 | class Banner extends React.PureComponent {
7 | render() {
8 | const { ...currentProps } = this.props;
9 | const { dataSource } = currentProps;
10 | delete currentProps.dataSource;
11 | delete currentProps.isMobile;
12 | return (
13 |
14 |
20 |
21 | {typeof dataSource.title.children === 'string' &&
22 | dataSource.title.children.match(
23 | /\.(svg|gif|jpg|jpeg|png|JPG|PNG|GIF|JPEG)$/
24 | ) ? (
25 |

26 | ) : (
27 | dataSource.title.children
28 | )}
29 |
30 |
31 | {dataSource.content.children}
32 |
33 |
36 |
37 |
47 |
48 |
49 |
50 | );
51 | }
52 | }
53 | export default Banner;
54 |
--------------------------------------------------------------------------------
/src/Home/less/content1.less:
--------------------------------------------------------------------------------
1 | @content1: content1;
2 | .@{content1}-wrapper {
3 | height: 360px;
4 | .@{content1} {
5 | height: 100%;
6 | padding: 0 24px;
7 | &-img {
8 | height: 100%;
9 | transform-origin: top;
10 | padding: 0 32px;
11 | display: flex;
12 | align-items: center;
13 | justify-content: center;
14 | span {
15 | display: block;
16 | width: 250px;
17 | img {
18 | display: block;
19 | }
20 | }
21 | }
22 | &-text {
23 | padding: 0 32px;
24 | height: 100%;
25 | .@{content1}-content,
26 | .@{content1}-title {
27 | position: relative !important;
28 | }
29 | .@{content1}-title {
30 | font-size: 32px;
31 | font-weight: normal;
32 | color: #404040;
33 | margin-top: 120px;
34 | }
35 | .content {
36 | margin-top: 20px;
37 | }
38 | }
39 | }
40 | }
41 |
42 | @media screen and (max-width: 767px) {
43 | .@{content1}-wrapper {
44 | height: 500px;
45 | .@{content1} {
46 | &-img {
47 | height: 200px;
48 | padding: 0;
49 | text-align: center;
50 | margin-top: 64px;
51 | span {
52 | display: inline-block;
53 | width: 180px;
54 | height: 200px;
55 | line-height: 200px;
56 | margin: auto;
57 | }
58 | }
59 | &-text {
60 | height: auto;
61 | margin-bottom: 20px;
62 | text-align: center;
63 | padding: 0;
64 | .@{content1}-content,
65 | .@{content1}-title {
66 | width: 100%;
67 | top: auto;
68 | }
69 | .@{content1}-title {
70 | margin: 32px auto 16px;
71 | font-size: 24px;
72 | }
73 | }
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/Home/Footer1.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import TweenOne from 'rc-tween-one';
3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
4 | import QueueAnim from 'rc-queue-anim';
5 | import { Row, Col } from 'antd';
6 |
7 | class Footer extends React.Component {
8 | static defaultProps = {
9 | className: 'footer1',
10 | };
11 |
12 | getLiChildren = (data) =>
13 | data.map((item, i) => {
14 | return (
15 |
16 |
17 | {typeof item.title.children === 'string' &&
18 | item.title.children.match(
19 | /\.(svg|gif|jpg|jpeg|png|JPG|PNG|GIF|JPEG)$/
20 | ) ? (
21 |
22 | ) : (
23 | item.title.children
24 | )}
25 |
26 | {item.content.children}
27 |
28 | );
29 | });
30 |
31 | render() {
32 | const { ...props } = this.props;
33 | const { dataSource } = props;
34 | delete props.dataSource;
35 | delete props.isMobile;
36 | const childrenToRender = this.getLiChildren(dataSource.block.children);
37 | return (
38 |
39 |
40 |
47 | {childrenToRender}
48 |
49 |
54 |
55 |
56 | {dataSource.copyright.children}
57 |
58 |
59 |
60 |
61 |
62 | );
63 | }
64 | }
65 |
66 | export default Footer;
67 |
--------------------------------------------------------------------------------
/src/Home/less/banner0.less:
--------------------------------------------------------------------------------
1 | @banner0: banner0;
2 | .@{banner0} {
3 | // 如果在第一屏且导航位置为 relative, 一屏为 height: calc(~"100vh - 64px");
4 | width: 100%;
5 | height: 100vh;
6 | position: relative;
7 | text-align: center;
8 | border-color: #666;
9 | background-image: url("https://zos.alipayobjects.com/rmsportal/gGlUMYGEIvjDOOw.jpg");
10 | background-size: cover;
11 | background-attachment: fixed;
12 | background-position: center;
13 | & &-text-wrapper {
14 | display: inline-block;
15 | position: absolute;
16 | top: 20%;
17 | margin: auto;
18 | left: 0;
19 | right: 0;
20 | font-size: 14px;
21 | color: @template-text-color-light;
22 | width: 550px;
23 | >.queue-anim-leaving {
24 | position: relative !important;
25 | }
26 | }
27 | & &-title {
28 | width: 350px;
29 | min-height: 60px;
30 | margin: auto;
31 | display: inline-block;
32 | font-size: 40px;
33 | position: relative;
34 | }
35 | & &-content {
36 | margin-bottom: 20px;
37 | word-wrap: break-word;
38 | min-height: 24px;
39 | }
40 | & &-button {
41 | border: 1px solid #fff;
42 | color: #fff;
43 | background: transparent;
44 | box-shadow: 0 0 0 transparent;
45 | line-height: 40px;
46 | font-size: 16px;
47 | height: 40px;
48 | transition: background .45s @ease-out, box-shadow .45s @ease-out;
49 | &:hover {
50 | color: #fff;
51 | border-color: #fff;
52 | background: rgba(255, 255, 255, 0.1);
53 | box-shadow: 0 0 10px rgba(50, 250, 255, 0.75);
54 | }
55 | &:focus {
56 | color: #fff;
57 | border-color: #fff;
58 | }
59 | &.queue-anim-leaving {
60 | width: auto;
61 | }
62 | }
63 | & &-icon {
64 | bottom: 20px;
65 | font-size: 24px;
66 | position: absolute;
67 | left: 50%;
68 | margin-left: -12px;
69 | color: @template-text-color-light;
70 | }
71 | }
72 |
73 | @media screen and (max-width: 767px) {
74 | .@{banner0} {
75 | background-attachment: inherit;
76 | & &-text-wrapper {
77 | width: 90%;
78 | }
79 | & &-title {
80 | width: 90%;
81 | left: 0;
82 | }
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/src/Home/Content1.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import QueueAnim from 'rc-queue-anim';
3 | import TweenOne from 'rc-tween-one';
4 | import { Row, Col } from 'antd';
5 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
6 |
7 | function Content1(props) {
8 | const { ...tagProps } = props;
9 | const { dataSource, isMobile } = tagProps;
10 | delete tagProps.dataSource;
11 | delete tagProps.isMobile;
12 | const animType = {
13 | queue: isMobile ? 'bottom' : 'right',
14 | one: isMobile
15 | ? {
16 | scaleY: '+=0.3',
17 | opacity: 0,
18 | type: 'from',
19 | ease: 'easeOutQuad',
20 | }
21 | : {
22 | x: '-=30',
23 | opacity: 0,
24 | type: 'from',
25 | ease: 'easeOutQuad',
26 | },
27 | };
28 | return (
29 |
30 |
31 |
42 |
43 |
44 |
45 |
46 |
58 |
59 | {dataSource.title.children}
60 |
61 |
62 | {dataSource.content.children}
63 |
64 |
65 |
66 |
67 | );
68 | }
69 |
70 | export default Content1;
71 |
--------------------------------------------------------------------------------
/src/Home/Content0.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import QueueAnim from 'rc-queue-anim';
3 | import { Row, Col } from 'antd';
4 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
5 |
6 | class Content extends React.PureComponent {
7 | getBlockChildren = (data) =>
8 | data.map((item, i) => {
9 | const children = item.children;
10 | return (
11 |
12 |
13 |

14 |
15 | {children.title.children}
16 | {children.content.children}
17 |
18 | );
19 | });
20 |
21 | render() {
22 | const { ...props } = this.props;
23 | const { dataSource } = props;
24 | delete props.dataSource;
25 | delete props.isMobile;
26 | const listChildren = this.getBlockChildren(dataSource.block.children);
27 | return (
28 |
29 |
30 |
31 | {dataSource.titleWrapper.children.map((item, i) =>
32 | React.createElement(
33 | item.name.indexOf('title') === 0 ? 'h1' : 'div',
34 | { key: i.toString(), ...item },
35 | typeof item.children === 'string' &&
36 | item.children.match(
37 | /\.(svg|gif|jpg|jpeg|png|JPG|PNG|GIF|JPEG)$/
38 | )
39 | ? React.createElement('img', {
40 | src: item.children,
41 | height: '100%',
42 | alt: 'img',
43 | })
44 | : item.children
45 | )
46 | )}
47 |
48 |
49 |
56 | {listChildren}
57 |
58 |
59 |
60 |
61 | );
62 | }
63 | }
64 |
65 | export default Content;
66 |
--------------------------------------------------------------------------------
/src/Home/Nav0.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import TweenOne from 'rc-tween-one';
3 | import { Menu } from 'antd';
4 |
5 | const Item = Menu.Item;
6 |
7 | class Header extends React.Component {
8 | constructor(props) {
9 | super(props);
10 | this.state = {
11 | phoneOpen: false,
12 | menuHeight: 0,
13 | };
14 | this.menu = React.createRef();
15 | }
16 |
17 | /*
18 | componentDidMount() {
19 | // 如果是 react 16.3 以下版本请使用 findDOMNode;
20 | this.menuDom = findDOMNode(this.menu);
21 | }
22 | */
23 |
24 | phoneClick = () => {
25 | const phoneOpen = !this.state.phoneOpen;
26 | this.setState({
27 | phoneOpen,
28 | menuHeight: phoneOpen ? this.menu.current.dom.scrollHeight : 0,
29 | });
30 | };
31 |
32 | render() {
33 | const { ...props } = this.props;
34 | const { dataSource, isMobile } = props;
35 | delete props.dataSource;
36 | delete props.isMobile;
37 | const { menuHeight, phoneOpen } = this.state;
38 | const navData = dataSource.Menu.children;
39 | const navChildren = Object.keys(navData).map((key, i) => (
40 | -
41 |
46 | {navData[key].a.children}
47 |
48 |
49 | ));
50 | return (
51 |
57 |
61 |
65 |
66 |
67 | {isMobile && (
68 |
{
71 | this.phoneClick();
72 | }}
73 | >
74 |
75 |
76 |
77 |
78 | )}
79 |
{ this.menu = c; }}
83 | style={isMobile ? { height: menuHeight } : null}
84 | >
85 |
92 |
93 |
94 |
95 | );
96 | }
97 | }
98 |
99 | export default Header;
100 |
--------------------------------------------------------------------------------
/src/Home/index.jsx:
--------------------------------------------------------------------------------
1 | /* eslint no-undef: 0 */
2 | /* eslint arrow-parens: 0 */
3 | import React from 'react';
4 | import { enquireScreen } from 'enquire-js';
5 |
6 | import Nav0 from './Nav0';
7 | import Banner0 from './Banner0';
8 | import Content0 from './Content0';
9 | import Content3 from './Content3';
10 | import Content1 from './Content1';
11 | import Content11 from './Content11';
12 | import Footer1 from './Footer1';
13 |
14 | import {
15 | Nav00DataSource,
16 | Banner00DataSource,
17 | Content00DataSource,
18 | Content30DataSource,
19 | Content10DataSource,
20 | Content110DataSource,
21 | Footer10DataSource,
22 | } from './data.source';
23 | import './less/antMotionStyle.less';
24 |
25 | let isMobile;
26 | enquireScreen((b) => {
27 | isMobile = b;
28 | });
29 |
30 | const { location } = window;
31 |
32 | export default class Home extends React.Component {
33 | constructor(props) {
34 | super(props);
35 | this.state = {
36 | isMobile,
37 | show: !location.port, // 如果不是 dva 2.0 请删除
38 | };
39 | }
40 |
41 | componentDidMount() {
42 | // 适配手机屏幕;
43 | enquireScreen((b) => {
44 | this.setState({ isMobile: !!b });
45 | });
46 | // dva 2.0 样式在组件渲染之后动态加载,导致滚动组件不生效;线上不影响;
47 | /* 如果不是 dva 2.0 请删除 start */
48 | if (location.port) {
49 | // 样式 build 时间在 200-300ms 之间;
50 | setTimeout(() => {
51 | this.setState({
52 | show: true,
53 | });
54 | }, 500);
55 | }
56 | /* 如果不是 dva 2.0 请删除 end */
57 | }
58 |
59 | render() {
60 | const children = [
61 | ,
67 | ,
73 | ,
79 | ,
85 | ,
91 | ,
97 | ,
103 | ];
104 | return (
105 | {
108 | this.dom = d;
109 | }}
110 | >
111 | {/* 如果不是 dva 2.0 替换成 {children} start */}
112 | {this.state.show && children}
113 | {/* 如果不是 dva 2.0 替换成 {children} end */}
114 |
115 | );
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/src/Home/less/nav0.less:
--------------------------------------------------------------------------------
1 | @header: header0;
2 | .@{header} {
3 | background: @template-nav-bg-color;
4 | width: 100%;
5 | z-index: 1;
6 | box-shadow: 0 5px 8px fade(#000, 15);
7 | position: relative;
8 | top: 0;
9 | .home-page {
10 | padding: 0 24px;
11 | }
12 | &-logo {
13 | display: inline-block;
14 | position: relative;
15 | width: 150px;
16 | line-height: 64px;
17 | & img {
18 | vertical-align: middle;
19 | display: inline-block;
20 | }
21 | & a {
22 | display: block;
23 | }
24 | }
25 | &-menu {
26 | float: right;
27 | >.ant-menu {
28 | line-height: 62px;
29 | background: transparent;
30 | color: @template-text-color-light;
31 | height: 64px;
32 | border-bottom-color: transparent;
33 | position: relative;
34 | a {
35 | color: @template-text-color-light;
36 | &:hover {
37 | color: @primary-color;
38 | }
39 | }
40 | }
41 | }
42 | .ant-menu-item-selected a {
43 | color: @primary-color;
44 | }
45 | }
46 |
47 | @media screen and (max-width: 767px) {
48 | .@{header} {
49 | &-logo {
50 | z-index: 101;
51 | }
52 | &.home-page-wrapper .home-page {
53 | padding: 0 24px;
54 | }
55 | & &-menu {
56 | height: auto;
57 | float: inherit;
58 | position: relative;
59 | left: -24px;
60 | width: ~"calc(100% + 48px)";
61 | opacity: 0;
62 | transition: opacity .3s @ease-in-out, height .3s @ease-in-out;
63 | & li {
64 | padding: 0 24px;
65 | &.ant-menu-submenu {
66 | padding: 0;
67 | }
68 | }
69 | & .ant-menu-submenu .ant-menu-sub {
70 | padding: 0 24px;
71 | }
72 | }
73 | &-mobile-menu {
74 | width: 16px;
75 | height: 14px;
76 | cursor: pointer;
77 | position: absolute;
78 | top: 24px;
79 | right: 24px;
80 | z-index: 100;
81 | em {
82 | display: block;
83 | width: 100%;
84 | height: 2px;
85 | background: #fff;
86 | margin-top: 4px;
87 | transition: transform .3s @ease-in-out, opacity .3s @ease-in-out;
88 | }
89 | :first-child {
90 | margin-top: 0;
91 | }
92 | }
93 | .ant-menu {
94 | height: auto;
95 | overflow: hidden;
96 |
97 | background: @template-bg-color;
98 | .ant-menu-item-selected {
99 | border: none;
100 | }
101 | a {
102 | color: @template-text-color-light;
103 | &:hover {
104 | color: @template-text-color-light;
105 | }
106 | }
107 | .ant-menu-item-selected a {
108 | color: @template-text-color-light;
109 | }
110 | }
111 | & .open {
112 | height: auto;
113 | .@{header}-mobile-menu {
114 | em {
115 | &:nth-child(1) {
116 | transform: translateY(6px) rotate(45deg);
117 | }
118 | &:nth-child(2) {
119 | opacity: 0;
120 | }
121 | &:nth-child(3) {
122 | transform: translateY(-6px) rotate(-45deg);
123 | }
124 | }
125 | }
126 | >.@{header}-menu {
127 | opacity: 1;
128 | pointer-events: auto;
129 | }
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/Home/Content3.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import QueueAnim from 'rc-queue-anim';
3 | import TweenOne from 'rc-tween-one';
4 | import { Row, Col } from 'antd';
5 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
6 |
7 | class Content3 extends React.PureComponent {
8 | getDelay = (e, b) => (e % b) * 100 + Math.floor(e / b) * 100 + b * 100;
9 |
10 | render() {
11 | const { ...props } = this.props;
12 | const { dataSource, isMobile } = props;
13 | delete props.dataSource;
14 | delete props.isMobile;
15 | let clearFloatNum = 0;
16 | const children = dataSource.block.children.map((item, i) => {
17 | const childObj = item.children;
18 | const delay = isMobile ? i * 50 : this.getDelay(i, 24 / item.md);
19 | const liAnim = {
20 | opacity: 0,
21 | type: 'from',
22 | ease: 'easeOutQuad',
23 | delay,
24 | };
25 | const childrenAnim = { ...liAnim, x: '+=10', delay: delay + 100 };
26 | clearFloatNum += item.md;
27 | clearFloatNum = clearFloatNum > 24 ? 0 : clearFloatNum;
28 | return (
29 |
41 |
51 |
52 |
53 |
54 |
60 | {childObj.title.children}
61 |
62 |
68 | {childObj.content.children}
69 |
70 |
71 |
72 | );
73 | });
74 | return (
75 |
76 |
77 |
78 | {dataSource.titleWrapper.children.map((item, i) =>
79 | React.createElement(
80 | item.name.indexOf('title') === 0 ? 'h1' : 'div',
81 | { key: i.toString(), ...item },
82 | typeof item.children === 'string' &&
83 | item.children.match(
84 | /\.(svg|gif|jpg|jpeg|png|JPG|PNG|GIF|JPEG)$/
85 | )
86 | ? React.createElement('img', {
87 | src: item.children,
88 | alt: 'img',
89 | })
90 | : item.children
91 | )
92 | )}
93 |
94 |
95 |
96 |
97 | {children}
98 |
99 |
100 |
101 |
102 |
103 | );
104 | }
105 | }
106 |
107 | export default Content3;
108 |
--------------------------------------------------------------------------------
/src/Home/data.source.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | export const Nav00DataSource = {
3 | wrapper: { className: 'header0 home-page-wrapper' },
4 | page: { className: 'home-page' },
5 | logo: {
6 | className: 'header0-logo',
7 | children: 'https://i.loli.net/2019/03/25/5c984c1120873.png',
8 | },
9 | Menu: {
10 | className: 'header0-menu',
11 | children: [
12 | { name: 'item0', a: { children: '官网', href: 'http://xb.exrick.cn' } },
13 | {
14 | name: 'item1',
15 | a: {
16 | children: '在线演示',
17 | href: 'http://xboot.exrick.cn',
18 | target: '_black',
19 | },
20 | },
21 | {
22 | name: 'item2',
23 | a: {
24 | children: '开发文档',
25 | href: 'https://www.kancloud.cn/exrick/xboot/content',
26 | target: '_black',
27 | },
28 | },
29 | {
30 | name: 'item3',
31 | a: {
32 | children: '获取完整版',
33 | href: 'http://xpay.exrick.cn/pay?xboot',
34 | target: '_black',
35 | },
36 | },
37 | {
38 | name: 'item4',
39 | a: {
40 | children: '商用授权',
41 | href: 'http://wpa.qq.com/msgrd?v=3&uin=1012139570&site=qq&menu=yes',
42 | target: '_black',
43 | },
44 | },
45 | ],
46 | },
47 | mobileMenu: { className: 'header0-mobile-menu' },
48 | };
49 | export const Banner00DataSource = {
50 | wrapper: { className: 'banner0' },
51 | textWrapper: { className: 'banner0-text-wrapper' },
52 | title: {
53 | className: 'banner0-title jtnstd5q52-editor_css',
54 | children: 'https://i.loli.net/2019/04/01/5ca1b48e23ac4.png',
55 | },
56 | content: {
57 | className: 'banner0-content',
58 | children: (
59 |
60 | XBoot前后端分离快速开发平台
61 |
62 | ),
63 | },
64 | button: {
65 | className: 'banner0-button jtntac62itf-editor_css',
66 | href: "http://xboot.exrick.cn",
67 | children: (
68 |
69 | 立即体验
70 |
71 | )
72 | },
73 | };
74 | export const Content00DataSource = {
75 | wrapper: { className: 'home-page-wrapper content0-wrapper' },
76 | page: { className: 'home-page content0' },
77 | OverPack: { playScale: 0.3, className: '' },
78 | titleWrapper: {
79 | className: 'title-wrapper',
80 | children: [
81 | {
82 | name: 'title',
83 | children: (
84 |
85 | 框架特性
86 |
87 | ),
88 | },
89 | ],
90 | },
91 | block: {
92 | className: 'block-wrapper',
93 | children: [
94 | {
95 | name: 'block0',
96 | className: 'block',
97 | md: 8,
98 | xs: 24,
99 | children: {
100 | icon: {
101 | className: 'icon',
102 | children:
103 | 'https://zos.alipayobjects.com/rmsportal/WBnVOjtIlGWbzyQivuyq.png',
104 | },
105 | title: {
106 | className: 'content0-title',
107 | children: (
108 |
109 | 快速开发
110 |
111 | ),
112 | },
113 | content: {
114 | children: (
115 |
116 | Java、Vue、SQL代码生成效率翻四倍
117 |
118 | ),
119 | },
120 | },
121 | },
122 | {
123 | name: 'block1',
124 | className: 'block',
125 | md: 8,
126 | xs: 24,
127 | children: {
128 | icon: {
129 | className: 'icon',
130 | children:
131 | 'https://zos.alipayobjects.com/rmsportal/YPMsLQuCEXtuEkmXTTdk.png',
132 | },
133 | title: {
134 | className: 'content0-title',
135 | children: (
136 |
137 | Activiti工作流
138 |
139 | ),
140 | },
141 | content: {
142 | children: (
143 |
144 | 前后端分离集成十分完整、简单配置的工作流
145 |
146 | ),
147 | },
148 | },
149 | },
150 | {
151 | name: 'block2',
152 | className: 'block',
153 | md: 8,
154 | xs: 24,
155 | children: {
156 | icon: {
157 | className: 'icon',
158 | children:
159 | 'https://zos.alipayobjects.com/rmsportal/EkXWVvAaFJKCzhMmQYiX.png',
160 | },
161 | title: {
162 | className: 'content0-title',
163 | children: (
164 |
165 | 权限管理
166 |
167 | ),
168 | },
169 | content: {
170 | children: (
171 |
172 | 动态权限管理、多维度轻松控制权限按钮显示
173 |
174 | ),
175 | },
176 | },
177 | },
178 | ],
179 | },
180 | };
181 | export const Content30DataSource = {
182 | wrapper: { className: 'home-page-wrapper content3-wrapper' },
183 | page: { className: 'home-page content3' },
184 | OverPack: { playScale: 0.3 },
185 | titleWrapper: {
186 | className: 'title-wrapper',
187 | children: [
188 | {
189 | name: 'title',
190 | children: (
191 |
192 | 完整版及商用版提供服务
193 |
194 | ),
195 | className: 'title-h1',
196 | },
197 | {
198 | name: 'content',
199 | className: 'title-content',
200 | children: (
201 |
202 | 基于GitLab提供永久免费更新维护
203 |
204 | ),
205 | },
206 | ],
207 | },
208 | block: {
209 | className: 'content3-block-wrapper',
210 | children: [
211 | {
212 | name: 'block0',
213 | className: 'content3-block',
214 | md: 8,
215 | xs: 24,
216 | children: {
217 | icon: {
218 | className: 'content3-icon',
219 | children:
220 | 'https://zos.alipayobjects.com/rmsportal/ScHBSdwpTkAHZkJ.png',
221 | },
222 | textWrapper: { className: 'content3-text' },
223 | title: {
224 | className: 'content3-title',
225 | children: (
226 |
227 | 消息管理
228 |
229 | ),
230 | },
231 | content: {
232 | className: 'content3-content',
233 | children: (
234 |
235 | 基于WebSocket实现站内消息实时推送与管理。
236 |
237 | ),
238 | },
239 | },
240 | },
241 | {
242 | name: 'block1',
243 | className: 'content3-block',
244 | md: 8,
245 | xs: 24,
246 | children: {
247 | icon: {
248 | className: 'content3-icon',
249 | children:
250 | 'https://zos.alipayobjects.com/rmsportal/NKBELAOuuKbofDD.png',
251 | },
252 | textWrapper: { className: 'content3-text' },
253 | title: {
254 | className: 'content3-title',
255 | children: (
256 |
257 | 社交账号管理
258 |
259 | ),
260 | },
261 | content: {
262 | className: 'content3-content',
263 | children: (
264 |
265 |
266 | 支持多种第三社交账号登录,不干涉原用户数据,实现第三方账号管理。
267 |
268 |
269 | ),
270 | },
271 | },
272 | },
273 | {
274 | name: 'block2',
275 | className: 'content3-block',
276 | md: 8,
277 | xs: 24,
278 | children: {
279 | icon: {
280 | className: 'content3-icon',
281 | children:
282 | 'https://zos.alipayobjects.com/rmsportal/xMSBjgxBhKfyMWX.png',
283 | },
284 | textWrapper: { className: 'content3-text' },
285 | title: {
286 | className: 'content3-title',
287 | children: (
288 |
289 | 文件管理
290 |
291 | ),
292 | },
293 | content: {
294 | className: 'content3-content',
295 | children: (
296 |
297 |
298 | 支持本地或第三方阿里云、腾讯云、七牛云文件存储服务,可动态任意切换。
299 |
300 |
301 | ),
302 | },
303 | },
304 | },
305 | {
306 | name: 'block3',
307 | className: 'content3-block',
308 | md: 8,
309 | xs: 24,
310 | children: {
311 | icon: {
312 | className: 'content3-icon',
313 | children:
314 | 'https://zos.alipayobjects.com/rmsportal/MNdlBNhmDBLuzqp.png',
315 | },
316 | textWrapper: { className: 'content3-text' },
317 | title: {
318 | className: 'content3-title',
319 | children: (
320 |
321 | 工作流
322 |
323 | ),
324 | },
325 | content: {
326 | className: 'content3-content',
327 | children: (
328 |
329 | 集成完整简单使用的Activiti工作流,省去大量繁杂配置。
330 |
331 | ),
332 | },
333 | },
334 | },
335 | {
336 | name: 'block4',
337 | className: 'content3-block',
338 | md: 8,
339 | xs: 24,
340 | children: {
341 | icon: {
342 | className: 'content3-icon',
343 | children:
344 | 'https://zos.alipayobjects.com/rmsportal/UsUmoBRyLvkIQeO.png',
345 | },
346 | textWrapper: { className: 'content3-text' },
347 | title: {
348 | className: 'content3-title',
349 | children: (
350 |
351 | Vue代码生成
352 |
353 | ),
354 | },
355 | content: {
356 | className: 'content3-content',
357 | children: (
358 |
359 |
360 | 一键生成Vue表格或树形操作代码,无需依赖数据库,随时随地生成。
361 |
362 |
363 | ),
364 | },
365 | },
366 | },
367 | {
368 | name: 'block5',
369 | className: 'content3-block',
370 | md: 8,
371 | xs: 24,
372 | children: {
373 | icon: {
374 | className: 'content3-icon',
375 | children:
376 | 'https://zos.alipayobjects.com/rmsportal/ipwaQLBLflRfUrg.png',
377 | },
378 | textWrapper: { className: 'content3-text' },
379 | title: {
380 | className: 'content3-title',
381 | children: (
382 |
383 | 丰富模版组件
384 |
385 | ),
386 | },
387 | content: {
388 | className: 'content3-content',
389 | children: (
390 |
391 |
392 | 一站式开发平台,提供前后台使用业务组件以及前端产品级组件。
393 |
394 |
395 | ),
396 | },
397 | },
398 | },
399 | ],
400 | },
401 | };
402 | export const Content10DataSource = {
403 | wrapper: { className: 'home-page-wrapper content1-wrapper' },
404 | OverPack: { className: 'home-page content1', playScale: 0.3 },
405 | imgWrapper: { className: 'content1-img', md: 10, xs: 24 },
406 | img: {
407 | children: 'https://zos.alipayobjects.com/rmsportal/nLzbeGQLPyBJoli.png',
408 | },
409 | textWrapper: { className: 'content1-text', md: 14, xs: 24 },
410 | title: {
411 | className: 'content1-title',
412 | children: (
413 |
414 | XBoot Flutter APP
415 |
416 | ),
417 | },
418 | content: {
419 | className: 'content1-content',
420 | children: (
421 |
422 | 基于Flutter开发的XBoot配套移动端APP开发中,敬请期待!
423 |
424 | ),
425 | },
426 | };
427 | export const Content110DataSource = {
428 | OverPack: {
429 | className: 'home-page-wrapper content11-wrapper',
430 | playScale: 0.3,
431 | },
432 | titleWrapper: {
433 | className: 'title-wrapper',
434 | children: [
435 | {
436 | name: 'image',
437 | children:
438 | 'https://gw.alipayobjects.com/zos/rmsportal/PiqyziYmvbgAudYfhuBr.svg',
439 | className: 'title-image',
440 | },
441 | {
442 | name: 'title',
443 | children: (
444 |
445 | 完整版获取
446 |
447 | ),
448 | className: 'title-h1',
449 | },
450 | {
451 | name: 'content',
452 | children: (
453 |
454 | 为开发者提供完整功能源码以供参考学习
455 |
456 | ),
457 | className: 'title-content',
458 | },
459 | {
460 | name: 'content2',
461 | children: (
462 |
463 | 完整版仅供学习,不得商用
464 |
465 | ),
466 | className: 'title-content',
467 | },
468 | ],
469 | },
470 | button: {
471 | className: '',
472 | children: {
473 | a: {
474 | className: 'button',
475 | href: 'http://xpay.exrick.cn/pay?xboot',
476 | children: (
477 |
478 | 立即获取
479 |
480 | ),
481 | target: '_blank',
482 | },
483 | },
484 | },
485 | };
486 | export const Footer10DataSource = {
487 | wrapper: { className: 'home-page-wrapper footer1-wrapper' },
488 | OverPack: { className: 'footer1', playScale: 0.2 },
489 | block: {
490 | className: 'home-page',
491 | children: [
492 | {
493 | name: 'block0',
494 | xs: 24,
495 | md: 6,
496 | className: 'block',
497 | title: {
498 | className: 'logo',
499 | children: 'https://i.loli.net/2019/03/25/5c984c1120873.png',
500 | },
501 | content: {
502 | className: 'slogan',
503 | children: (
504 |
505 |
506 | A Rapid Development Platform for Front-end and Back-end
507 | Separation.
508 |
509 |
510 | ),
511 | },
512 | },
513 | {
514 | name: 'block1',
515 | xs: 24,
516 | md: 6,
517 | className: 'block',
518 | title: { children: '产品' },
519 | content: {
520 | children: (
521 |
522 |
523 | Github开源版本
524 |
525 |
526 |
527 | 更新记录
528 |
529 |
530 |
531 | 获取完整版
532 |
533 |
534 |
535 | 商用授权
536 |
537 |
538 |
539 | ),
540 | },
541 | },
542 | {
543 | name: 'block2',
544 | xs: 24,
545 | md: 6,
546 | className: 'block',
547 | title: { children: '关于' },
548 | content: {
549 | children: (
550 |
551 |
552 | FAQ
553 |
554 |
555 |
556 | 联系作者
557 |
558 |
559 |
560 | ),
561 | },
562 | },
563 | {
564 | name: 'block3',
565 | xs: 24,
566 | md: 6,
567 | className: 'block',
568 | title: { children: '资源' },
569 | content: {
570 | children: (
571 |
572 |
573 | 开发文档
574 |
575 |
576 |
577 | 本站源码
578 |
579 |
580 |
581 | iView
582 |
583 |
584 |
585 | iView Admin
586 |
587 |
588 |
589 | ),
590 | },
591 | },
592 | ],
593 | },
594 | copyrightWrapper: { className: 'copyright-wrapper' },
595 | copyrightPage: { className: 'home-page' },
596 | copyright: {
597 | className: 'copyright',
598 | children: (
599 |
600 |
601 | ©2018 - Present by Exrick All Rights Reserved
602 |
603 |
604 | ),
605 | },
606 | };
607 |
--------------------------------------------------------------------------------