This commit is contained in:
2024-03-01 20:28:14 +08:00
commit 076c21dc36
491 changed files with 84482 additions and 0 deletions

View File

@@ -0,0 +1,409 @@
import './Home.scss';
import React, { PureComponent as Component } from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { Row, Col, Button, Icon, Card } from 'antd';
import PropTypes from 'prop-types';
import { withRouter } from 'react-router';
import LogoSVG from '../../components/LogoSVG/index.js';
import { changeMenuItem } from '../../reducer/modules/menu';
const plugin = require('client/plugin.js');
const ThirdLogin = plugin.emitHook('third_login');
const HomeGuest = () => (
<div className="g-body">
<div className="m-bg">
<div className="m-bg-mask m-bg-mask0" />
<div className="m-bg-mask m-bg-mask1" />
<div className="m-bg-mask m-bg-mask2" />
<div className="m-bg-mask m-bg-mask3" />
</div>
<div className="main-one">
<div className="container">
<Row>
<Col span={24}>
<div className="home-header">
<a href="#" className="item">
YAPI
</a>
<a
target="_blank"
rel="noopener noreferrer"
href="https://hellosean1025.github.io/yapi"
className="item"
>
使用文档
</a>
</div>
</Col>
</Row>
<Row>
<Col lg={9} xs={24}>
<div className="home-des">
<div className="logo">
<LogoSVG length="72px" />
<span className="name">YAPI</span>
</div>
<div className="detail">
高效易用功能强大的API管理平台<br />
<span className="desc">旨在为开发产品测试人员提供更优雅的接口管理服务</span>
</div>
<div className="btn-group">
<Link to="/login">
<Button type="primary" className="btn-home btn-login">
登录 / 注册
</Button>
</Link>
{ThirdLogin != null ? <ThirdLogin /> : null}
</div>
</div>
</Col>
<Col lg={15} xs={0} className="col-img">
<div className="img-container">
</div>
</Col>
</Row>
</div>
</div>
<div className="feat-part section-feature">
<div className="container home-section">
<h3 className="title">为API开发者设计的管理平台</h3>
<span className="desc">
YApi让接口开发更简单高效让接口的管理更具可读性可维护性让团队协作更合理
</span>
<Row key="feat-motion-row">
<Col span={8} className="section-item" key="feat-wrapper-1">
<Icon type="appstore-o" className="img" />
<h4 className="title">项目管理</h4>
<span className="desc">提供基本的项目分组项目管理接口管理功能</span>
</Col>
<Col span={8} className="section-item" key="feat-wrapper-2">
<Icon type="api" className="img" />
<h4 className="title">接口管理</h4>
<span className="desc">
友好的接口文档基于websocket的多人协作接口编辑功能和类postman测试工具让多人协作成倍提升开发效率
</span>
</Col>
<Col span={8} className="section-item" key="feat-wrapper-3">
<Icon type="database" className="img" />
<h4 className="title">MockServer</h4>
<span className="desc">基于Mockjs使用简单功能强大</span>
</Col>
</Row>
</div>
</div>
<div className="feat-part m-mock m-skew home-section">
<div className="m-skew-bg">
<div className="m-bg-mask m-bg-mask0" />
<div className="m-bg-mask m-bg-mask1" />
<div className="m-bg-mask m-bg-mask2" />
</div>
<div className="container skew-container">
<h3 className="title">功能强大的 Mock 服务</h3>
<span className="desc">你想要的 Mock 服务都在这里</span>
<Row className="row-card">
<Col lg={12} xs={24} className="section-card">
<Card title="Mock 规则">
<p className="mock-desc">
通过学习一些简单的 Mock
模板规则即可轻松编写接口这将大大提高定义接口的效率并且无需为编写 Mock 数据烦恼:
所有的数据都可以实时随机生成
</p>
<div className="code">
<ol start="1">
<li className="item">
<span className="orderNum orderNum-first">1</span>
<span>
<span>&#123;&ensp;&ensp;</span>
</span>
</li>
<li className="item">
<span className="orderNum">2</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">
&quot;errcode|200-500&quot;
</span>
<span>
:&ensp;<span className="number">200</span>,&ensp;&ensp;
</span>
</span>
</li>
<li className="item">
<span className="orderNum">3</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">&quot;errmsg|4-8&quot;</span>
<span>:&ensp;</span>
<span className="string">&quot;@string&quot;</span>
<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="item">
<span className="orderNum">4</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">&quot;data&quot;</span>
<span>:&ensp;&#123;&ensp;&ensp;</span>
</span>
</li>
<li className="item">
<span className="orderNum">5</span>
<span>
&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<span className="string">
&quot;boolean|1&quot;
</span>
<span>:&ensp;</span>
<span className="keyword">true</span>
<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="item">
<span className="orderNum">6</span>
<span>
&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<span className="string">
&quot;array|2&quot;
</span>
<span>
:&ensp;&#91;<span className="string">&quot;Bob&quot;</span>,&ensp;<span className="string">
&quot;Jim&quot;
</span>&#93;,&ensp;&ensp;
</span>
</span>
</li>
<li className="item">
<span className="orderNum">7</span>
<span>
&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<span className="string">
&quot;combine&quot;
</span>
<span>:&ensp;</span>
<span className="string">&quot;@boolean&ensp;&amp;&ensp;@array&quot;</span>
<span>&ensp;&ensp;</span>
</span>
</li>
<li className="item">
<span className="orderNum">8</span>
<span>&ensp;&ensp;&ensp;&ensp;&#125;&ensp;&ensp;</span>
</li>
<li className="item">
<span className="orderNum orderNum-last">9</span>
<span>&#125;&ensp;&ensp;</span>
</li>
</ol>
</div>
</Card>
</Col>
<Col lg={12} xs={24} className="section-card mock-after">
<Card title="生成的 Mock 数据">
<p className="mock-desc">
生成的 Mock 数据可以直接用 ajax
请求使用也可以通过服务器代理使用不需要修改项目一行代码
</p>
<div className="code">
<ol start="1">
<li className="alt">
<span className="orderNum orderNum-first">1</span>
<span>
<span>&#123;&ensp;&ensp;</span>
</span>
</li>
<li className="">
<span className="orderNum">2</span>
<span>
&ensp;&ensp;<span className="string">&quot;errcode&quot;</span>
<span>:&ensp;</span>
<span className="number">304</span>
<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="alt">
<span className="orderNum">3</span>
<span>
&ensp;&ensp;<span className="string">&quot;errmsg&quot;</span>
<span>:&ensp;</span>
<span className="string">&quot;JtkMIoRu)N#ie^h%Z77[F)&quot;</span>
<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="">
<span className="orderNum">4</span>
<span>
&ensp;&ensp;<span className="string">&quot;data&quot;</span>
<span>:&ensp;&#123;&ensp;&ensp;</span>
</span>
</li>
<li className="alt">
<span className="orderNum">5</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">&quot;boolean&quot;</span>
<span>:&ensp;</span>
<span className="keyword">true</span>
<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="">
<span className="orderNum">6</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">&quot;array&quot;</span>
<span>
:&ensp;
</span>&#91;<span className="string">&quot;Bob&quot;</span>,&ensp;<span className="string">
&quot;Jim&quot;
</span>,&ensp;<span className="string">&quot;Bob&quot;</span>,&ensp;<span className="string">
&quot;Jim&quot;
</span>&#93;<span>,&ensp;&ensp;</span>
</span>
</li>
<li className="alt">
<span className="orderNum">7</span>
<span>
&ensp;&ensp;&ensp;&ensp;<span className="string">&quot;combine&quot;</span>
<span>:&ensp;</span>
<span className="string">
&quot;true & Bob,&ensp;Jim,&ensp;Bob,&ensp;Jim&quot;
</span>
<span>&ensp;&ensp;</span>
</span>
</li>
<li className="">
<span className="orderNum">8</span>
<span>&ensp;&ensp;&#125;&ensp;&ensp;</span>
</li>
<li className="alt">
<span className="orderNum orderNum-last">9</span>
<span>&#125;&ensp;&ensp;</span>
</li>
</ol>
</div>
</Card>
</Col>
</Row>
</div>
</div>
<div className="home-section section-manage">
<div className="container">
<Row className="row-card" style={{ marginBottom: '.48rem' }}>
<Col lg={7} xs={10} className="section-card">
<Card>
<div className="section-block block-first">
<h4>超级管理员(* N)</h4>
<p className="item"> - 创建分组</p>
<p className="item"> - 分配组长</p>
<p className="item"> - 管理所有成员信息</p>
</div>
<div className="section-block block-second">
<h4>组长(* N)</h4>
<p className="item"> - 创建项目</p>
<p className="item"> - 管理分组或项目的信息</p>
<p className="item"> - 管理开发者与成员</p>
</div>
<div className="section-block block-third">
<h4>开发者(* N) / 成员(* N)</h4>
<p className="item"> - 不允许创建分组</p>
<p className="item"> - 不允许修改分组或项目信息</p>
</div>
</Card>
</Col>
<Col lg={17} xs={14} className="section-card manage-word">
<Icon type="team" className="icon" />
<h3 className="title">扁平化管理模式</h3>
<p className="desc">
接口管理的逻辑较为复杂操作频率高层层审批将严重拖慢生产效率因此传统的金字塔管理模式并不适用
</p>
<p className="desc">
YAPI
将扁平化管理模式的思想引入到产品的权限管理中超级管理员拥有最高的权限并将权限分配给若干组长超级管理员只需管理组长即可实际上管理YAPI各大分组与项目的是组长组长对分组或项目负责一般由BU负责人/项目负责人担任
</p>
</Col>
</Row>
</div>
</div>
</div>
);
HomeGuest.propTypes = {
introList: PropTypes.array
};
@connect(
state => ({
login: state.user.isLogin
}),
{
changeMenuItem
}
)
@withRouter
class Home extends Component {
constructor(props) {
super(props);
}
UNSAFE_componentWillMount() {
if (this.props.login) {
this.props.history.push('/group/261');
}
}
componentDidMount() {}
static propTypes = {
introList: PropTypes.array,
login: PropTypes.bool,
history: PropTypes.object,
changeMenuItem: PropTypes.func
};
toStart = () => {
this.props.changeMenuItem('/group');
};
render() {
return (
<div className="home-main">
<HomeGuest introList={this.props.introList} />
<div className="row-tip">
<div className="container">
<div className="tip-title">
<h3 className="title">准备好使用了吗</h3>
<p className="desc">注册账号尽请使用吧查看使用文档了解更多信息</p>
</div>
<div className="tip-btns">
<div className="btn-group">
<Link to="/login">
<Button type="primary" className="btn-home btn-login">
登录 / 注册
</Button>
</Link>
<Button className="btn-home btn-home-normal">
<a target="_blank" rel="noopener noreferrer" href="https://hellosean1025.github.io/yapi">
使用文档
</a>
</Button>
</div>
</div>
</div>
</div>
</div>
);
}
}
// Home.defaultProps={
// introList:[{
// title:"接口管理",
// des:"满足你的所有接口管理需求。不再需要为每个项目搭建独立的接口管理平台和编写离线的接口文档,其权限管理和项目日志让协作开发不再痛苦。",
// detail:[
// {title:"团队协作",des:"多成员协作,掌握项目进度",iconType:"team"},
// {title:"权限管理",des:"设置每个成员的操作权限",iconType:"usergroup-add"},
// {title:"项目日志",des:"推送项目情况,掌握更新动态",iconType:"schedule"}
// ],
// img:"./image/demo-img.jpg"
// },{
// title:"接口测试",
// des:"一键即可得到返回结果。根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、mock规则生成Mock接口这些接口会自动生成模拟数据。",
// detail:[
// {title:"编辑接口",des:"团队开发时任何人都可以在权限许可下创建、修改接口",iconType:"tags-o"},
// {title:"mock请求",des:"创建者可以自由构造需要的数据,支持复杂的生成逻辑",iconType:"fork"}
// ],
// img:"./image/demo-img.jpg"
// }
// ]
// };
export default Home;

View File

@@ -0,0 +1,528 @@
@import '../../styles/mixin.scss';
$color-white : #fff;
$color-blue-lighter : #f1f5ff;
$color-blue-grey-lighter : #f7fafc;
$color-grey-lighter : #F7F7F7;
$color-blue-light: #5dade2;
$color-black-lighter: #404040;
$color-text-dark: #2e2e5a;
$color-text-light: #6d7c90;
$color-bg-lightblue: #c6e2ff;
.g-body {
position: relative;
}
.home-header {
font-size: 0;
.item {
text-decoration: none;
display: inline-block;
color: #fff;
font-size: .17rem;
padding: .16rem .24rem;
-webkit-font-smoothing: antialiased;
&:hover {
color: #27cdfd;
}
}
}
// 按钮组
.btn-group {
padding: .3rem .24rem;
.btn-home {
font-size: .15rem;
font-weight: 200;
letter-spacing: 1px;
border: none;
line-height: .4rem;
height: .4rem;
padding: 0 .24rem;
margin-right: .24rem;
box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);
transform: translateY(0);
transition: all .2s;
&:hover {
transform: translateY(-1px);
box-shadow: 0 7px 14px rgba(50,50,93,.1), 0 3px 6px rgba(0,0,0,.08);
}
&:active {
transform: translateY(1px);
}
}
.btn-login {
background-color: #32325d;
&:hover {
background-color: #43459a;
}
&:active, &:focus {
color: #e6ebf1;
background-color: #32325d;
}
}
.btn-home-normal {
border-radius: 4px;
color: #43459a;
&:hover {
color: #7795f8;
}
&:hover, &:focus {
background-color: #f6f9fc;
}
background-color: #fff;
cursor: pointer;
}
}
.m-bg {
position: absolute;
left: 0;
top: -400px;
height: 1000px;
width: 100%;
transform: skewY(-11deg);
background-image: linear-gradient(-20deg, #21d4fd 0%, #b721ff 100%);
.m-bg-mask {
position: absolute;
height: 180px;
}
.m-bg-mask0 {
bottom: 0;
left: 0;
width: 30%;
background-image: linear-gradient(120deg, #6ab3fd 0%, #8ba3fd 102%);
}
.m-bg-mask1 {
bottom: 180px;
right: 0;
width: 36%;
background-image: linear-gradient(120deg, #28c5f5 0%, #6682fe 100%);
}
.m-bg-mask2 {
bottom: 540px;
left: 0;
width: 20%;
height: 240px;
background-image: linear-gradient(120deg, #8121ff 0%, #5e5ef7 100%);
}
.m-bg-mask3 {
bottom: 540px;
left: 20%;
width: 70%;
height: 240px;
background-image: linear-gradient(-225deg, #5f2bff 0%, #6088fe 48%, #22ccf6 100%);
}
}
.home-main {
background-color: #fff;
display: -webkit-box;
-webkit-box-orient: vertical;
.main-one{
height: 600px;
.home-des{
padding: 1rem 0 0;
color: #fff;
.title{
font-size: .6rem;
}
.detail{
font-size: .2rem;
}
.logo {
display: flex;
align-items: center;
padding: 0 .24rem;
}
.svg {
animation: spin 5s linear infinite;
}
.name {
vertical-align: middle;
font-size: .48rem;
margin-left: .24rem;
font-weight: 200;
}
.detail {
padding: .24rem;
font-size: .24rem;
font-weight: 200;
}
.desc {
font-size: .18rem;
}
}
.login-form{
color: $color-white;
}
.main-one-left{
padding-right: .15rem;
margin-top: .2rem;
}
.main-one-right{
padding-left: .5rem;
padding-top: .3rem;
}
}
.user-home{
display: flex;
align-items: center;
height: 100%;
margin: 1rem auto 0;
.user-des{
margin: 0 auto .5rem;
text-align: center;
.title{
font-size: .8rem;
margin-bottom: .2rem;
}
.des{
font-size: .25rem;
margin-bottom: .3rem;
}
.btn{
button{
font-size: .2rem;
line-height: .2rem;
height: .5rem;
padding: .15rem .5rem;
}
}
}
}
.main-part{
padding: 1.5rem 0;
height: 5.8rem;
&:nth-child(odd){
background-color: $color-blue-lighter;
}
&:nth-child(even){
background-color: $color-white;
}
}
.feat-part{
padding: 1.5rem 0;
background-color: $color-white;
}
.section-feature {
min-height: 6rem;
}
.container{
margin: 0 auto;
height:100%;
position: relative;
max-width: 12.2rem;
}
.feat-wrapper {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
.feat-img {
height: 1.2rem;
width: 1.2rem;
border-radius: 100%;
margin-bottom: .2rem;
color: $color-white;
i {
line-height: 1.2rem;
font-size: .6rem;
}
}
.feat-title {
font-size: .16rem;
line-height: .3rem;
}
&:first-child {
.feat-img {
background-color: rgb(248, 88, 96);
}
}
&:nth-child(2) {
.feat-img {
background-color: #f9bb13;
}
}
&:nth-child(3) {
.feat-img {
background-color: #20ab8e;
}
}
&:nth-child(4) {
.feat-img {
background-color: rgb(66, 165, 245);
}
}
}
.img-container{
width: 100%;
position: absolute;
top: .74rem;
left: 50%;
transform: translateX(-50%);
text-align: right;
.img{
width: 7.12rem;
border-radius: 4px;
box-shadow : 0 30px 60px rgba(0,0,0,0.2);
}
}
.m-skew {
position: relative;
.skew-container {
padding: 0 1rem;
}
.m-skew-bg {
position: absolute;
left: 0;
top: 5%;
height: 600px;
width: 100%;
transform: skewY(-11deg);
background-image: linear-gradient(180deg, #93a5cf 0%, #e4efe9 100%);
.m-bg-mask {
position: absolute;
height: 200px;
}
.m-bg-mask0 {
bottom: 0;
left: 0;
width: 30%;
background-image: linear-gradient(120deg, #6ab3fd 0%, #c1cfde 102%);
}
.m-bg-mask1 {
bottom: 200px;
right: 0;
width: 36%;
background-image: linear-gradient(219deg, #84a1ce 0%, #e4efe9 100%);
}
.m-bg-mask2 {
top: 0;
left: 0;
width: 30%;
background-image: linear-gradient(219deg, #93a5cf 0%, #d7e3e5 100%);
}
}
}
}
.home-section {
text-align: center;
-webkit-font-smoothing: antialiased;
.title {
color: $color-text-dark;
line-height: .32rem;
margin-bottom: .08rem;
font-size: .24rem;
}
.desc {
color: $color-text-light;
font-size: .16rem;
}
.section-item {
text-align: left;
padding: .24rem;
.img {
width: .48rem;
height: .48rem;
background-image: linear-gradient(-20deg, #21d4fd 0%, #b721ff 100%);
border-radius: 50%;
text-align: center;
line-height: .48rem;
font-size: .24rem;
color: #fff;
margin-bottom: .24rem;
}
.title {
color: $color-text-dark;
font-size: .2rem;
}
.desc {
color: $color-text-light;
font-size: .16rem;
}
}
.row-card {
margin-top: .48rem;
padding: 0 .24rem;
}
.section-card {
padding-bottom: 1rem;
.ant-card {
font-size: .17rem;
border-radius: .04rem;
box-shadow: 0 16px 35px rgba(50,50,93,.1), 0 5px 16px rgba(0,0,0,.07);
border: none;
}
.ant-card:not(.ant-card-no-hovering):hover {
box-shadow: 0 16px 35px rgba(50,50,93,.1), 0 5px 16px rgba(0,0,0,.07);
}
.ant-card-head {
background-color: $color-blue-grey-lighter;
border-top-left-radius: .04rem;
border-top-right-radius: .04rem;
}
.ant-card-head-title {
font-size: .17rem;
color: $color-text-dark;
}
.ant-card-body {
text-align: left;
padding: 0;
}
.mock-desc {
padding: .32rem;
min-height: 8em;
}
padding: .08rem;
}
.code {
color: $color-text-light;
background-color: $color-blue-grey-lighter;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
.orderNum {
background-color: $color-bg-lightblue;
display: inline-block;
text-align: center;
width: .4rem;
margin-right: .5em;
user-select: none;
}
.orderNum-first {
padding-top: .5em;
}
.orderNum-last {
border-bottom-left-radius: 4px;
padding-bottom: .5em;
}
.string {
color: #ff561b;
}
.number {
color: #57cf27;
}
.keyword {
color: #2359f1;
}
.item {
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
}
.mock-after {
.ant-card-head {
background-color: $color-bg-lightblue;
}
.ant-card-head-title {
color: #4074af;
}
}
}
.section-manage {
.section-card{
padding-top: .24rem;
.ant-card {
border-radius: .04rem;
}
.ant-card-body {
padding: 0;
}
}
.section-block {
padding: .24rem;
.item {
font-size: .14rem;
}
}
.block-first {
background-color: #5f48fe;
border-top-left-radius: .04rem;
border-top-right-radius: .04rem;
}
.block-second {
background-color: #5f79fe;
}
.block-third {
background-color: #3ab1f9;
border-bottom-left-radius: .04rem;
border-bottom-right-radius: .04rem;
}
.ant-card-body, h4 {
color: #fff;
}
.manage-word {
text-align: left;
padding-left: .48rem;
.icon {
width: .72rem;
height: .72rem;
line-height: .72rem;
text-align: center;
background-color: #5f48fe;
border-radius: 50%;
font-size: .4rem;
color: #fff;
margin-bottom: .24rem;
}
.desc {
margin-bottom: .16rem;
}
}
}
.row-tip {
margin-top: .48rem;
padding-top: .48rem;
padding-bottom: .24rem;
background-color: #ececec;
.container {
display: flex;
align-items: center;
max-width: 12.2rem;
.tip-title {
flex: 2;
}
.tip-btns {
flex: 1;
}
}
.btn-group {
white-space: nowrap;
}
.title {
-webkit-font-smoothing: antialiased;
padding-left: .24rem;
color: #2e2e5a;
line-height: .32rem;
margin-bottom: .08rem;
font-size: .24rem;
}
.desc {
-webkit-font-smoothing: antialiased;
padding-left: .24rem;
color: #6d7c90;
font-size: .16rem;
}
}
// LOGO 旋转动画
@keyframes spin
{
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (max-width: 1200px) {
.home-header, .home-des {
text-align: center;
}
.home-main .main-one .home-des .logo {
justify-content: center;
}
}