Commit 2d6e62de by xuzhenghua

test

parent 8797b9e8
......@@ -3692,6 +3692,11 @@
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
},
"clipboard-copy": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-3.1.0.tgz",
"integrity": "sha512-Xsu1NddBXB89IUauda5BIq3Zq73UWkjkaQlPQbLNvNsd5WBMnTWPNKYR6HGaySOxGYZ+BKxP2E9X4ElnI3yiPA=="
},
"cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
......@@ -3984,14 +3989,6 @@
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
"copy-to-clipboard": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz",
"integrity": "sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w==",
"requires": {
"toggle-selection": "^1.0.6"
}
},
"core-js": {
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
......@@ -12087,15 +12084,6 @@
}
}
},
"react-copy-to-clipboard": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz",
"integrity": "sha512-ELKq31/E3zjFs5rDWNCfFL4NvNFQvGRoJdAKReD/rUPA+xxiLPQmZBZBvy2vgH7V0GE9isIQpT9WXbwIVErYdA==",
"requires": {
"copy-to-clipboard": "^3",
"prop-types": "^15.5.8"
}
},
"react-dev-utils": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-8.0.0.tgz",
......@@ -14514,11 +14502,6 @@
"repeat-string": "^1.6.1"
}
},
"toggle-selection": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
"integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
},
"topo": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz",
......
......@@ -37,6 +37,10 @@ class App extends Component {
...this.props.location
}
records = []
firstLoad = true
componentDidMount() {
// 友盟统计
const script = document.createElement('script');
......@@ -44,7 +48,7 @@ class App extends Component {
script.language = 'JavaScript';
document.body.appendChild(script);
this.setNavigationRecord(this.props.location)
this.setNavigationRecord(this.props.location, this.props.history.action)
//平台信息
......@@ -58,9 +62,10 @@ class App extends Component {
this.utm()
const routeMatchRule = /binding-tel|forgot|set-password/
const {history} = this.props
history.listen((location) => {
history.listen((location, action) => {
this.firstLoad = false
this.setNavigationRecord(location, action)
this.utm()
this.setNavigationRecord(location)
if (cookie.get('uid') && this.props.user.hasError) {
this.getUser()
}
......@@ -69,7 +74,7 @@ class App extends Component {
if (routeMatchRule.test(pathname)) {
return
}
location.state = {from: this.previousLocation};
location.state = {...location.state, ...{from: this.previousLocation}};
} else {
this.removeShareCodeCookie()
}
......@@ -82,17 +87,23 @@ class App extends Component {
cookie.remove('share_code', {path: '/', domain: '.julyedu.com'})
}
setNavigationRecord = (location) => {
let {location: _location} = this.props
let {state: _state = {}} = _location
let {state = {}} = location
location.state = {
...state, ...{
record: _state.record ?
[..._state.record, {pathname: location.pathname, search: location.search, hash: location.hash}] :
[{pathname: location.pathname, search: '', hash: ''}]
}
setNavigationRecord = (location, action) => {
const {pathname, search, hash} = location
let isLastRecord = location.pathname === this.records.length && this.records[this.records.length - 1].pathname
switch (action) {
case 'POP':
this.firstLoad ? this.records.push({pathname, search, hash}) : this.records.pop()
break
case 'REPLACE':
this.records[this.records.length - 1] = {pathname, search, hash}
break
default:
!isLastRecord && this.records.push({pathname, search, hash})
}
location.state && location.state.records
? (location.state.records = this.records)
: (location.state = {records: this.records})
}
......@@ -158,15 +169,33 @@ class App extends Component {
}
componentDidUpdate() {
const {location} = this.props
this.previousLocation = location.pathname.startsWith('/passport') ?
this.previousLocation.pathname === '/' ? location : this.previousLocation : location
this.setPreviousLocation()
if (!this.props.user.hasError && getParam('redirect')) {
window.location.href = getParam('redirect')
}
}
setPreviousLocation = () => {
const {location, history: {action}} = this.props
if (location.pathname.startsWith('/passport')) {
let index = this.records.findIndex(item => item.pathname.startsWith('/passport'))
this.previousLocation = index > 0
? this.records[index - 1]
: this.records.length
? this.records[this.records.length - 1]
: null
} else {
if (action === 'POP' || action === 'REPLACE') {
let index = this.records.findIndex(item => item.pathname.startsWith('/passport'))
this.previousLocation = index > 0 ? this.records[index - 1] : this.records[this.records.length - 1]
} else {
this.previousLocation = location
}
}
}
transformUser = res => {
let payload
......
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1566442194316'); /* IE9 */
src: url('iconfont.eot?t=1566442194316#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
url('iconfont.woff?t=1566442194316') format('woff'),
url('iconfont.ttf?t=1566442194316') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1566442194316#iconfont') format('svg'); /* iOS 4.1- */
src: url('iconfont.eot?t=1568272104473'); /* IE9 */
src: url('iconfont.eot?t=1568272104473#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
url('iconfont.woff?t=1568272104473') format('woff'),
url('iconfont.ttf?t=1568272104473') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1568272104473#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
......@@ -551,3 +551,7 @@
content: "\e683";
}
.icongengduo:before {
content: "\e650";
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -422,6 +422,9 @@ Created by iconfont
<glyph glyph-name="play_hovericon" unicode="&#59011;" d="M512 896c282.763636 0 512-229.236364 512-512s-229.236364-512-512-512S0 101.236364 0 384 229.236364 896 512 896z m182.760727-552.680727a46.545455 46.545455 0 0 1 0 81.361454l-311.086545 172.846546A23.272727 23.272727 0 0 1 349.090909 577.163636v-386.327272a23.272727 23.272727 0 0 1 34.583273-20.363637l311.086545 172.846546z" horiz-adv-x="1024" />
<glyph glyph-name="gengduo" unicode="&#58960;" d="M511.616 883.328c-137.344 0-254.72-49.024-352.128-147.2C61.824 638.72 13.184 521.344 13.184 384c0-137.856 48.768-255.616 146.304-353.024 97.408-97.536 214.912-146.304 352.128-146.304 137.856 0 255.616 48.768 353.152 146.304 97.408 97.408 146.176 215.168 146.176 353.024 0 137.344-48.768 254.72-146.176 352.256C767.104 834.304 649.472 883.328 511.616 883.328zM198.528 696.96C285.312 783.744 389.76 827.136 511.616 827.136c122.496 0 227.072-43.392 313.856-130.176 86.784-86.144 130.176-190.464 130.176-312.96 0-122.496-43.392-227.072-130.176-313.856C738.688-16.768 633.984-60.16 511.616-60.16c-122.496 0-226.816 43.52-313.088 130.304C111.744 156.928 68.352 261.504 68.352 383.872c0 121.856 43.52 226.304 130.176 313.088z m469.12-313.088c0-14.208 4.736-26.496 14.336-36.608 10.112-9.472 22.016-14.336 35.712-14.336 13.568-0.128 26.496 5.12 36.096 14.72s14.848 22.528 14.72 36.096c-0.128 13.312-5.504 26.112-15.104 35.456-9.472 9.344-22.4 14.592-35.712 14.464-13.696 0-25.6-4.736-35.712-14.208-9.6-9.984-14.336-21.76-14.336-35.584z m-105.216 0c0 13.696-4.736 25.6-14.336 35.712-9.856 9.344-22.912 14.464-36.608 14.208-13.696 0-25.6-4.736-35.712-14.208-9.472-10.112-14.336-22.016-14.336-35.712 0-14.208 4.736-26.496 14.336-36.608 10.112-9.472 22.016-14.336 35.712-14.336 14.336 0 26.496 4.736 36.608 14.336 9.472 9.984 14.592 23.168 14.336 36.608z m-206.08 0c0 13.696-4.736 25.6-14.336 35.712-9.6 9.216-22.4 14.336-35.712 14.208-27.776 0-50.432-22.528-50.432-50.432 0-27.776 22.528-50.432 50.432-50.432 13.696 0 25.6 4.736 35.712 14.336 9.472 9.984 14.592 23.04 14.336 36.608z m0 0" horiz-adv-x="1024" />
</font>
......
......@@ -24,12 +24,21 @@ const options = {
class OpenApp extends Component {
callApp = new CallApp(options)
// callApp = new CallApp(options)
callApp = null
static defaultProps = {
text: '在APP打开'
}
componentWillMount() {
this.callApp = new CallApp({
...options,
path: this.props.path || '/'
});
}
handleClick = () => {
this.callApp.open({})
}
......
......@@ -7,10 +7,10 @@ const CAPTCHAID = '6b0f5f6c8f334f3693ee754ba5692e36'
class Captcha extends Component {
componentDidMount() {
const {getInstance, handleError, onVerify} = this.props
const el = document.getElementById('captcha')
const el = document.getElementById('captcha');
el && initCaptcha(function () {
initNECaptcha({
element: '#captcha',
element: el,
captchaId: CAPTCHAID,
mode: 'float',
width: 'auto',
......
......@@ -13,7 +13,7 @@ class HeaderBar extends Component {
if(browser.isWeixin && getParam('code') && getParam('state')){
window.history.go(-2)
}
if(state.record && state.record.length > 1){
if(state.records && state.records.length > 1){
window.history.go(-1);
}else{
window.location.href = window.location.origin
......
......@@ -3,7 +3,12 @@ import './index.scss'
const VList = (props) => {
return (
<li className='v-list-item' onClick={() => props.toDetail(props.id)}>
<li
className='v-list-item'
onClick={() => {
typeof props.toDetail === 'function' && props.toDetail(props.id)
}}
>
<div className="content">
<div className="cover">
{props.status}
......
import React, { Component } from 'react';
import QRCode from 'qrcode';
import { http } from "@/utils"
import './index.scss';
class FollowBarcode extends Component {
constructor(props) {
super(props);
this.state = {
url: ''
}
}
componentDidMount() {
console.log(this.props);
const { userInfo: { uid = '' } } = this.props;
if(uid) {
http.get(`${API['base-api']}/wx/user_temporary_qrcode/${uid}`).then((res) => {
const { errno, data } = res.data;
console.log(res);
if (errno == 0) {
this.setState({
url: data.url
});
return new Promise(resolve => {
QRCode.toDataURL(data.url, {}, function (err, url) {
this.setState({
codeUrl: url
})
});
resolve();
});
}
});
}
}
render() {
const { codeSrc } = this.state;
const { firendBaigainPrice, userInfo: { avatar }, money } = this.props;
return (
<div className='bargain-popup__barcode'>
<i className='bargain-popup__avatar' style={{backgroundImage: `url(${avatar})`}} />
{
firendBaigainPrice &&
<p className='bargain-popup__title'>谢谢你帮我砍了{money}元!</p>
}
<p className='bargain-popup__desc'>关注公众号,可以再砍一刀哦~</p>
<i className="bargain-popup__imgage" style={{backgroundImage: `url(${codeSrc})`}}></i>
</div>
);
}
}
export default FollowBarcode;
\ No newline at end of file
.bargain-popup__barcode {
width: 300px;
height: 185px;
margin: 200px auto 20px;
padding: 20px 0;
border-radius: 3px;
text-align: center;
background-color: $bg_fff;
}
.bargain-popup__avatar {
display: block;
width: 40px;
height: 40px;
margin: -40px auto 0;
border-radius: 50%;
background-size: cover;
}
.bargain-popup__title {
height: 16px;
margin: 10px auto 0;
font-size: 16px;
color: $color_FF4000;
line-height: 16px;
}
.bargain-popup__desc {
height: 12px;
margin: 10px auto 0;
font-size: 12px;
color: $color_666;
line-height: 12px;
}
.bargain-popup__imgage {
width: 86px;
height: 86px;
margin-top: 15px;
background-size: cover;
}
\ No newline at end of file
......@@ -167,8 +167,9 @@
float: right;
position: relative;
top: -20px;
width: 61px;
// width: 61px;
height: 24px;
padding: 0 10px;
background: $bg_FF4000;
border-radius: 12px;
font-size: 12px;
......@@ -533,8 +534,9 @@
.use-artifact {
background-color: $bg_fff;
width: 84px;
// width: 84px;
height: 24px;
padding: 0 13px;
font-size: 14px;
border: 1px solid $redprice;
border-radius: 12px;
......@@ -712,3 +714,28 @@
}
.bargain-popup__content {
text-align: center;
}
.bargain-popup__button--close {
font-size: 22px;
color: #fff;
}
.course-button__buy--done {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 61px;
height: 18px;
margin: auto 0;
border-radius: 9px;
font-size: 12px;
color: $white;
text-align: center;
line-height: 18px;
background-color: $bg_active;
}
......@@ -12,6 +12,7 @@ import {compose} from "redux"
import {connect} from "react-redux";
import {getCourses} from './../detail/actions';
import classnames from 'classnames';
import FollowBarcode from './barcode/index';
@connect(state => ({
user: state.user
......@@ -124,9 +125,11 @@ class BargainMiddlePage extends Component {
// 获取助理好友
getBargainRankList = (id, type) => {
const bargain_code = getParam('bargaincode') || '';
let data = {
courseId: id,
type: type
type: type,
bargain_code
}
http.post(`${API.home}/m/bargain/rankList`, data).then((res) => {
if (res.data.code === 200) {
......@@ -337,6 +340,7 @@ class BargainMiddlePage extends Component {
}
render() {
// console.log(this.props);
let thirdRow, btn
// is_artifact 0-再邀请多少人可以使用 1-可以使用未领取 2-已领取 3-已使用
if (this.state.bargainData.is_artifact === 0) {
......@@ -351,19 +355,38 @@ class BargainMiddlePage extends Component {
btn = <button className={'artifact-btn'} onClick={this.useArtifact}>立即使用</button>
}
let bargainBtn
if (this.state.isOriginator !== 1 && this.state.data.assist_status === 0 && this.state.data.bargain_status === 0) {
bargainBtn = <button className='active-btn' onClick={this.friendBargainFirst}>帮好友砍一刀</button>
} else if (this.state.isOriginator !== 1 && this.state.data.assist_status === 1) {
bargainBtn = <button className='active-btn' onClick={this.friendBargainSecond}>再砍一刀</button>
} else if (this.state.isOriginator !== 1 && this.state.data.assist_status === 2) {
bargainBtn = <button className={'invalid-btn'}>已帮好友助力</button>
} else if (this.state.data.bargain_status === 1 || this.state.data.bargain_status === 2) {
bargainBtn = <button className={'invalid-btn'}>砍价结束</button>
} else if (this.state.isOriginator === 1 && this.state.data.bargain_status === 0) {
bargainBtn = <button className='active-btn' onClick={this.shareFriendBargain}>邀请好友砍价</button>
const { data: { is_originator = 0, assist_status = 0, bargain_status = 0 } } = this.state;
let bargainBtn = '';
// assist_status 助力状态 0-未助力,1-已助力一次 2-已助力两次,不能再助力
// is_originator 是否发起人 0-否 1-是
// bargain_status 砍价状态 0-砍价中,1砍价结束,待支付,2砍价过期(没有砍价记录没有砍价信息),3已购买
if(is_originator) {
if(bargain_status === 0) {
bargainBtn = <button className='active-btn' onClick={this.shareFriendBargain}>邀请好友砍价</button>
}
}else {
if(assist_status === 0 && bargain_status === 0) {
bargainBtn = <button className='active-btn' onClick={this.friendBargainFirst}>帮好友砍一刀</button>
}else if (assist_status === 1 && bargain_status === 0) {
bargainBtn = <button className='active-btn' onClick={this.friendBargainSecond}>再砍一刀</button>
}else if (assist_status === 2 && bargain_status === 0) {
bargainBtn = <button className={'invalid-btn'}>已帮好友助力</button>
}else if (bargain_status !== 0) {
bargainBtn = <button className={'invalid-btn'}>砍价结束</button>
}
}
// if (this.state.isOriginator !== 1 && this.state.data.assist_status === 0 && this.state.data.bargain_status === 0) {
// bargainBtn = <button className='active-btn' onClick={this.friendBargainFirst}>帮好友砍一刀</button>
// } else if (this.state.isOriginator !== 1 && this.state.data.assist_status === 1) {
// bargainBtn = <button className='active-btn' onClick={this.friendBargainSecond}>再砍一刀1</button>
// } else if (this.state.isOriginator !== 1 && this.state.data.assist_status === 2) {
// bargainBtn = <button className={'invalid-btn'}>已帮好友助力</button>
// } else if (this.state.data.bargain_status === 1 || this.state.data.bargain_status === 2) {
// bargainBtn = <button className={'invalid-btn'}>砍价结束</button>
// } else if (this.state.isOriginator === 1 && this.state.data.bargain_status === 0) {
// bargainBtn = <button className='active-btn' onClick={this.shareFriendBargain}>邀请好友砍价</button>
// }
return (
<div className={'bargain-middle-page'}>
<HeaderBar title='砍价详情' arrow={true} cart={true} toHref={'/'}></HeaderBar>
......@@ -503,6 +526,9 @@ class BargainMiddlePage extends Component {
{
this.state.isShowOverlay &&
<Overlay>
<div className="bargain-popup__content">
{/*砍价成功去分享*/}
{
......@@ -513,12 +539,20 @@ class BargainMiddlePage extends Component {
{/*引导关注公众号*/}
{
{/* {
this.state.status === 1 &&
<PublicNumber
money={this.state.amount}
avatar={this.props.user.data.avatar}
firendBaigainPrice={this.state.firendBaigainPrice}/>
} */}
{
this.state.status === 1 &&
<FollowBarcode
userInfo={this.props.user.data}
money={this.state.amount}
firendBaigainPrice={this.state.firendBaigainPrice}
/>
}
{/*好友成功砍第一刀*/}
......@@ -553,8 +587,9 @@ class BargainMiddlePage extends Component {
{
this.state.status !== 7 &&
<i onClick={this.close} className={'iconfont iconiconfront-2 bargain-close'}></i>
<i onClick={this.close} className={'iconfont iconiconfront-2 bargain-popup__button--close'}></i>
}
</div>
</Overlay>
}
......@@ -565,24 +600,30 @@ class BargainMiddlePage extends Component {
}
}
// 课程信息 -- 右侧
function CourseDes(props) {
const data = props.data && props.data.course
const { data: { bargain_status = 0, course = {}, is_originator = 0 }, toCart } = props;
return (
<div className={'des'}>
<div className="course-title text-overflow-2">
{data.course_title}
{course.course_title}
</div>
<div className="price-bar">
<span className={'discount-price'}>{data.course_price}</span>
<span className={'discount-price'}>{course.course_price}</span>
{/* is_originator 是否发起人 0-否 1-是 */}
{
props.isOriginator === 1 &&
<button className={'purchase-btn'}
onClick={props.toCart}>¥{data.pay_price}去支付
(is_originator === 1 && bargain_status !== 3) &&
<button className={'purchase-btn'} onClick={toCart}>
¥{course.pay_price}去支付
</button>
}
{
(is_originator === 1 && bargain_status === 3) &&
<span className="course-button__buy--done">已购买</span>
}
</div>
</div>
)
);
}
function CourseBottom(props) {
......@@ -631,16 +672,17 @@ function CourseBottom(props) {
function PublicNumber(props) {
return (
<div className='bargain-public-number'>
<img className='avait' src={props.avatar} alt=""/>
<img className='avait' src={props.avatar} alt="" />
{
props.firendBaigainPrice &&
<p className='status-title ff4'>谢谢你帮我砍了{props.money}元!</p>
}
<p className='status-dec'>关注公众号,可以再砍一刀哦~</p>
<img className='public-number-img'
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/tinypng-common/right_weixin.png" alt=""/>
<img
className='public-number-img'
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/tinypng-common/right_weixin.png"
alt=""
/>
</div>
)
}
......@@ -661,7 +703,7 @@ function BargainSecond(props) {
<div className='bargain-second'>
<img className='top-img' src={require('./image/kanjia_cg_icon.png')} alt=""/>
<p className='status-title'>厉害了,又帮好友砍掉<span className='ff4'>{props.money}</span>!</p>
<Link className='bargain-href' to='#bargainCourse' onClick={props.close}>我也要砍价</Link>
<a className='bargain-href' href='#bargainCourse' onClick={props.close}>我也要砍价</a>
</div>
)
}
......@@ -672,7 +714,7 @@ function NotBargain(props) {
<img className='middle-img' src={require('./image/kanjia_no_iccon.png')} alt=""/>
<p className='status-title'>你的好友用【砍价神器】把我砍蒙圈了<br/>不能再砍了哦~</p>
<p className='status-dec'>邀请{props.limitPeople}位以上好友帮忙砍价可获得【砍价神器】</p>
<Link className='bargain-href' to='#bargainCourse' onClick={props.close}>我也要砍价</Link>
<a className='bargain-href' href='#bargainCourse' onClick={props.close}>我也要砍价</a>
</div>
)
}
......
......@@ -6,7 +6,7 @@ import HeaderSearch from '../../common/HeaderSearch/index'
import { http, getParam } from "@/utils"
import Loading from '@/common/Loading'
import { connect } from 'react-redux';
import { StickyContainer } from "react-sticky";
import { StickyContainer, Sticky } from "react-sticky";
function stopScroll(e) {
......@@ -26,7 +26,8 @@ class Classify extends Component {
allClass: [],
data: [],
activeTab: decodeURIComponent(getParam('name')),
isLoading: true
isLoading: true,
top: 44
}
}
......@@ -34,6 +35,11 @@ class Classify extends Component {
componentDidMount() {
this.getTabs()
this.getList()
const el = document.querySelector('.search-nav');
this.setState({
top: el.offsetHeight
});
}
componentWillUnmount() {
......@@ -149,12 +155,12 @@ class Classify extends Component {
/>
<Loading isLoading={this.state.isLoading}>
<div className='class-content'>
<WhiteSpace/>
{/* <WhiteSpace/> */}
<div onClick={this.pulldown.bind(this)}>
{this.state.ispull ? top : bottom}
</div>
<StickyContainer>
<Tabs
{/* <Tabs
tabs={this.state.allClass}
animated={false}
page={page}
......@@ -162,6 +168,25 @@ class Classify extends Component {
renderTabBar={props => <div className={'custom-render-bar'}>
<Tabs.DefaultTabBar {...props}/>
</div>}
> */}
<Tabs
tabs={this.state.allClass}
animated={false}
page={page}
onChange={(tab) => this.ontabclick(tab)}
renderTabBar={props => {
return (
<Sticky>
{({ style }) => {
return (
<div style={{ ...style, top: `${this.state.top}px`, zIndex: 1 }}>
<Tabs.DefaultTabBar {...props} />
</div>
)
}}
</Sticky>
)
}}
>
<div className='tabs'>
<ul>
......
......@@ -16,7 +16,8 @@ html,body,#root {
}
.class-content {
padding: 88px 12px 0;
padding: 44px 12px 0;
// padding: 88px 12px 0;
position: relative;
.custom-render-bar{
......
......@@ -10,7 +10,7 @@ export const delCountryNum = () => ({
type: 'DEL_COUNTRY_NUM'
});
export default (state = {}, action) => {
export default (state = {num: 86, code: null}, action) => {
const { type, payload } = action;
switch (type) {
case ADD_COUNTRY_NUM:
......
......@@ -13,8 +13,1020 @@ class Country extends Component {
constructor(props) {
super(props);
this.state = {
navs: ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
currentNav: 'A'
currentNav: 'A',
data: [
{
type: '0',
list: [
{
name: '中国大陆',
num: '86'
},
{
name: '美国',
num: '1'
},
{
name: '日本',
num: '81'
},
{
name: '中国香港',
num: '852'
},
{
name: '中国澳门',
num: '853'
},
{
name: '中国台湾',
num: '886'
},
{
name: '澳大利亚',
num: '61'
},
{
name: '加拿大',
num: '1'
},
{
name: '英国',
num: '44'
},
{
name: '新西兰',
num: '64'
},
]
},
{
type: 'A',
list: [
{
name: '阿富汗',
num: '93'
},
{
name: '阿尔巴尼亚',
num: '355'
},
{
name: '阿尔及利亚',
num: '213'
},
{
name: '安道尔',
num: '376'
},
{
name: '安哥拉',
num: '244'
},
{
name: '安圭拉',
num: '1264'
},
{
name: '安提瓜和巴布达',
num: '1268'
},
{
name: '阿根廷',
num: '54'
},
{
name: '阿鲁巴',
num: '297'
},
{
name: '阿塞拜疆',
num: '994'
},
{
name: '埃及',
num: '20'
},
{
name: '爱沙尼亚',
num: '372'
},
{
name: '埃塞俄比亚',
num: '251'
},
{
name: '爱尔兰',
num: '353'
},
{
name: '阿曼',
num: '968'
},
{
name: '阿拉伯联合酋长国',
num: '971'
},
{
name: '爱沙尼亚',
num: '372'
}
]
},
{
type: 'B',
list: [
{
name: '巴哈马',
num: '1242'
},
{
name: '巴林',
num: '973'
},
{
name: '巴巴多斯',
num: '1246'
},
{
name: '白俄罗斯',
num: '375'
},
{
name: '比利时',
num: '32'
},
{
name: '伯利兹',
num: '501'
},
{
name: '贝宁',
num: '229'
},
{
name: '百慕大群岛',
num: '1441'
},
{
name: '不丹',
num: '975'
},
{
name: '玻利维亚',
num: '591'
},
{
name: '波斯尼亚和黑塞哥维那',
num: '387'
},
{
name: '博茨瓦纳',
num: '267'
},
{
name: '巴西',
num: '55'
},
{
name: '保加利亚',
num: '359'
},
{
name: '布基纳法索',
num: '226'
},
{
name: '布隆迪',
num: '257'
},
{
name: '冰岛',
num: '354'
},
{
name: '巴基斯坦',
num: '92'
},
{
name: '巴勒斯坦',
num: '970'
},
{
name: '巴拿马',
num: '507'
},
{
name: '巴布亚新几内亚',
num: '675'
},
{
name: '巴拉圭',
num: '51'
},
{
name: '秘鲁',
num: '354'
},
{
name: '波兰',
num: '48'
},
{
name: '波多黎各',
num: '1787'
}
]
},
{
type: 'C',
list: [
{
name: '赤道几内亚',
num: '240'
}
]
},
{
type: 'D',
list: [
{
name: '丹麦',
num: '45'
},
{
name: '多米尼加',
num: '1767'
},
{
name: '多米尼加共和国',
num: '1809'
},
{
name: '德国',
num: '49'
},
{
name: '东帝汶',
num: '670'
},
{
name: '多哥',
num: '228'
}
]
},
{
type: 'E',
list: [
{
name: '厄瓜多尔',
num: '593'
},
{
name: '厄立特里亚',
num: '291'
},
{
name: '俄罗斯',
num: '7'
}
]
},
{
type: 'F',
list: [
{
name: '法罗群岛',
num: '298'
},
{
name: '斐济',
num: '679'
},
{
name: '芬兰',
num: '358'
},
{
name: '法国',
num: '594'
},
{
name: '法属圭亚那',
num: '45'
},
{
name: '法属波利尼西亚',
num: '689'
},
{
name: '菲律宾',
num: '63'
}
]
},
{
type: 'G',
list: [
{
name: '哥伦比亚',
num: '57'
},
{
name: '哥斯达黎加',
num: '506'
},
{
name: '古巴',
num: '53'
},
{
name: '刚果民主共和国',
num: '243'
},
{
name: '冈比亚',
num: '220'
},
{
name: '格鲁吉亚',
num: '995'
},
{
name: '格陵兰岛',
num: '299'
},
{
name: '格林纳达',
num: '1473'
},
{
name: '瓜德罗普岛',
num: '590'
},
{
name: '关岛',
num: '299'
},
{
name: '瓜地马拉',
num: '502'
},
{
name: '圭亚那',
num: '592'
},
{
name: '刚果共和国',
num: '242'
}
]
},
{
type: 'H',
list: [
{
name: '海地',
num: '509'
},
{
name: '洪都拉斯',
num: '504'
},
{
name: '黑山',
num: '382'
},
{
name: '荷兰',
num: '31'
},
{
name: '韩国',
num: '82'
}
]
},
{
type: 'J',
list: [
{
name: '加拿大',
num: '1'
},
{
name: '日本',
num: '81'
},
{
name: '柬埔寨',
num: '855'
},
{
name: '捷克',
num: '420'
},
{
name: '吉布提',
num: '253'
},
{
name: '加蓬',
num: '241'
},
{
name: '加纳',
num: '233'
},
{
name: '几内亚',
num: '224'
},
{
name: '几内亚比绍共和国',
num: '245'
},
{
name: '基里巴斯',
num: '686'
},
{
name: '吉尔吉斯斯坦',
num: '996'
},
{
name: '津巴布韦',
num: '263'
}
]
},
{
type: 'K',
list: [
{
name: '喀麦隆',
num: '237'
},
{
name: '开普',
num: '238'
},
{
name: '开曼群岛',
num: '1345'
},
{
name: '科摩罗',
num: '269'
},
{
name: '库克群岛',
num: '682'
},
{
name: '克罗地亚',
num: '385'
},
{
name: '库拉索',
num: '599'
},
{
name: '肯尼亚',
num: '254'
},
{
name: '科威特',
num: '965'
},
{
name: '卡塔尔',
num: '974'
},
{
name: '科特迪瓦',
num: '225'
}
]
},
{
type: 'L',
list: [
{
name: '老挝',
num: '856'
},
{
name: '拉脱维亚',
num: '371'
},
{
name: '黎巴嫩',
num: '961'
},
{
name: '莱索托',
num: '266'
},
{
name: '利比里亚',
num: '231'
},
{
name: '利比亚',
num: '218'
},
{
name: '列支敦士登',
num: '423'
},
{
name: '立陶宛',
num: '370'
},
{
name: '卢森堡',
num: '352'
},
{
name: '留尼汪',
num: '262'
},
{
name: '罗马尼亚',
num: '40'
},
{
name: '卢旺达',
num: '423'
}
]
},
{
type: 'M',
list: [
{
name: '美属萨摩亚',
num: '1684'
},
{
name: '孟加拉国',
num: '880'
},
{
name: '马其顿',
num: '389'
},
{
name: '马达加斯加',
num: '261'
},
{
name: '马拉维',
num: '265'
},
{
name: '马来西亚',
num: '60'
},
{
name: '马尔代夫',
num: '960'
},
{
name: '马里',
num: '223'
},
{
name: '马耳他',
num: '356'
},
{
name: '马提尼克',
num: '596'
},
{
name: '毛里塔尼亚',
num: '222'
},
{
name: '毛里求斯',
num: '230'
},
{
name: '墨西哥',
num: '52'
},
{
name: '摩尔多瓦',
num: '373'
},
{
name: '摩纳哥',
num: '377'
},
{
name: '蒙古',
num: '976'
},
{
name: '蒙特塞拉特岛',
num: '1664'
},
{
name: '摩洛哥',
num: '212'
},
{
name: '莫桑比克',
num: '258'
},
{
name: '缅甸',
num: '95'
},
{
name: '美属维尔京群岛',
num: '1284'
}
]
},
{
type: 'N',
list: [
{
name: '纳米比亚',
num: '264'
},
{
name: '尼泊尔',
num: '977'
},
{
name: '尼加拉瓜',
num: '505'
},
{
name: '尼日尔',
num: '227'
},
{
name: '尼日利亚',
num: '234'
},
{
name: '挪威',
num: '47'
},
{
name: '南非',
num: '27'
}
]
},
{
type: 'O',
list: [
{
name: '澳大利亚',
num: '61'
},
{
name: '奥地利',
num: '43'
}
]
},
{
type: 'P',
list: [
{
name: '帕劳',
num: '680'
},
{
name: '葡萄牙',
num: '351'
}
]
},
{
type: 'R',
list: [
{
name: '瑞典',
num: '46'
},
{
name: '瑞士',
num: '41'
}
]
},
{
type: 'S',
list: [
{
name: '塞浦路斯',
num: '357'
},
{
name: '萨尔瓦多',
num: '503'
},
{
name: '圣基茨和尼维斯',
num: '1869'
},
{
name: '圣露西亚',
num: '1758'
},
{
name: '圣皮埃尔岛及密克隆岛',
num: '508'
},
{
name: '圣文森特和格林纳丁斯',
num: '1784'
},
{
name: '萨摩亚',
num: '685'
},
{
name: '圣马力诺',
num: '378'
},
{
name: '圣多美和普林西比',
num: '239'
},
{
name: '沙特阿拉伯',
num: '966'
},
{
name: '塞内加尔',
num: '221'
},
{
name: '塞尔维亚',
num: '381'
},
{
name: '塞舌尔',
num: '248'
},
{
name: '塞拉利昂',
num: '239'
},
{
name: '圣马丁岛(荷兰部分)',
num: '1721'
},
{
name: '斯洛伐克',
num: '421'
},
{
name: '斯洛文尼亚',
num: '386'
},
{
name: '所罗门群岛',
num: '677'
},
{
name: '索马里',
num: '252'
},
{
name: '斯里兰卡',
num: '94'
},
{
name: '苏丹',
num: '249'
},
{
name: '苏里南',
num: '597'
},
{
name: '斯威士兰',
num: '268'
}
]
},
{
type: 'T',
list: [
{
name: '塔吉克斯坦',
num: '992'
},
{
name: '坦桑尼亚',
num: '255'
},
{
name: '泰国',
num: '66'
},
{
name: '汤加',
num: '676'
},
{
name: '特立尼达和多巴哥',
num: '1868'
},
{
name: '突尼斯',
num: '216'
},
{
name: '土耳其',
num: '90'
},
{
name: '土库曼斯坦',
num: '993'
},
{
name: '特克斯和凯科斯群岛',
num: '1649'
}
]
},
{
type: 'W',
list: [
{
name: '文莱',
num: '673'
},
{
name: '乌干达',
num: '256'
},
{
name: '乌克兰',
num: '380'
},
{
name: '乌拉圭',
num: '598'
},
{
name: '乌兹别克斯坦',
num: '998'
},
{
name: '瓦努阿图',
num: '678'
},
{
name: '委内瑞拉',
num: '58'
}
]
},
{
type: 'X',
list: [
{
name: '新西兰',
num: '64'
},
{
name: '希腊',
num: '30'
},
{
name: '匈牙利',
num: '36'
},
{
name: '新喀里多尼亚',
num: '687'
},
{
name: '新加坡',
num: '65'
},
{
name: '西班牙',
num: '34'
},
{
name: '叙利亚',
num: '963'
},
{
name: '亚美尼亚',
num: '374'
}
]
},
{
type: 'Y',
list: [
{
name: '英国',
num: '44'
},
{
name: '印度',
num: '91'
},
{
name: '印度尼西亚',
num: '62'
},
{
name: '伊朗',
num: '98'
},
{
name: '伊拉克',
num: '964'
},
{
name: '以色列',
num: '972'
},
{
name: '意大利',
num: '39'
},
{
name: '牙买加',
num: '1876'
},
{
name: '约旦',
num: '962'
},
{
name: '越南',
num: '84'
},
{
name: '英属处女群岛',
num: '1340'
},
{
name: '也门',
num: '967'
}
]
},
{
type: 'Z',
list: [
{
name: '中国',
num: '86'
},
{
name: '中国香港',
num: '852'
},
{
name: '中国澳门',
num: '853'
},
{
name: '中国台湾',
num: '886'
},
{
name: '中非共和国',
num: '236'
},
{
name: '乍得',
num: '235'
},
{
name: '智利',
num: '56'
},
{
name: '直布罗陀',
num: '350'
},
{
name: '赞比亚',
num: '260'
}
]
}
]
}
}
......@@ -28,32 +1040,39 @@ class Country extends Component {
}
judgeCurrentPosition = () => {
const { navs } = this.state;
const { data } = this.state;
let top = document.documentElement.scrollTop || document.body.scrollTop;
const lens = navs.map(item => {
let el = document.querySelector(`[data-type="${item}"]`);
const lens = data.map(item => {
let el = document.querySelector(`[data-type="${item['type']}"]`);
if(el) {
return el.offsetTop;
}
return '';
});
lens.map((item,index) => {
if(item && (top + 200) > item) {
if(item && top >= item) {
this.setState({
currentNav: navs[index]
currentNav: data[index]['type']
})
}
/*
if(item && (top + 200) > item) {
this.setState({
currentNav: data[index]['type']
})
}
*/
});
}
toParentPage = (e, num) => {
// console.log(this.props);
const { history, addCountryNum } = this.props;
addCountryNum({
num,
code: getParam('share_code')
});
history.push(`/detail?id=${getParam('id')}`);
// history.push(`/detail?id=${getParam('id')}`);
history.go(-1)
e.preventDefault();
}
......@@ -63,1043 +1082,28 @@ class Country extends Component {
this.setState({
currentNav: param
});
window.scrollTo({left: 0, top: el.offsetTop, behavior: 'smooth'})
/*
el.scrollIntoView({
behavior: 'smooth'
});
*/
}
}
render() {
const data = [
{
type: '0',
list: [
{
name: '中国大陆',
num: '86'
},
{
name: '中国澳门',
num: '853'
},
{
name: '中国香港',
num: '852'
},
{
name: '中国台湾',
num: '886'
}
]
},
{
type: 'A',
list: [
{
name: '阿富汗',
num: '93'
},
{
name: '阿尔巴尼亚',
num: '355'
},
{
name: '阿尔及利亚',
num: '213'
},
{
name: '安道尔',
num: '376'
},
{
name: '安哥拉',
num: '244'
},
{
name: '安圭拉',
num: '1264'
},
{
name: '安提瓜和巴布达',
num: '1268'
},
{
name: '阿根廷',
num: '54'
},
{
name: '阿鲁巴',
num: '297'
},
{
name: '阿塞拜疆',
num: '994'
},
{
name: '埃及',
num: '20'
},
{
name: '爱沙尼亚',
num: '372'
},
{
name: '埃塞俄比亚',
num: '251'
},
{
name: '爱尔兰',
num: '353'
},
{
name: '阿曼',
num: '968'
},
{
name: '阿拉伯联合酋长国',
num: '971'
},
{
name: '爱沙尼亚',
num: '372'
},
{
name: '爱沙尼亚',
num: '372'
},
{
name: '爱沙尼亚',
num: '372'
}
]
},
{
type: 'B',
list: [
{
name: '巴哈马',
num: '1242'
},
{
name: '巴林',
num: '973'
},
{
name: '巴巴多斯',
num: '1246'
},
{
name: '白俄罗斯',
num: '375'
},
{
name: '比利时',
num: '32'
},
{
name: '伯利兹',
num: '501'
},
{
name: '贝宁',
num: '229'
},
{
name: '百慕大群岛',
num: '1441'
},
{
name: '不丹',
num: '975'
},
{
name: '玻利维亚',
num: '591'
},
{
name: '波斯尼亚和黑塞哥维那',
num: '387'
},
{
name: '博茨瓦纳',
num: '267'
},
{
name: '巴西',
num: '55'
},
{
name: '保加利亚',
num: '359'
},
{
name: '布基纳法索',
num: '226'
},
{
name: '布隆迪',
num: '257'
},
{
name: '冰岛',
num: '354'
},
{
name: '巴基斯坦',
num: '92'
},
{
name: '巴勒斯坦',
num: '970'
},
{
name: '巴拿马',
num: '507'
},
{
name: '巴布亚新几内亚',
num: '675'
},
{
name: '巴拉圭',
num: '51'
},
{
name: '秘鲁',
num: '354'
},
{
name: '波兰',
num: '48'
},
{
name: '波多黎各',
num: '1787'
}
]
},
{
type: 'C',
list: [
{
name: '赤道几内亚',
num: '240'
}
]
},
{
type: 'D',
list: [
{
name: '丹麦',
num: '45'
},
{
name: '多米尼加',
num: '1767'
},
{
name: '多米尼加共和国',
num: '1809'
},
{
name: '德国',
num: '49'
},
{
name: '东帝汶',
num: '670'
},
{
name: '多哥',
num: '228'
}
]
},
{
type: 'E',
list: [
{
name: '厄瓜多尔',
num: '593'
},
{
name: '厄立特里亚',
num: '291'
},
{
name: '俄罗斯',
num: '7'
}
]
},
{
type: 'F',
list: [
{
name: '法罗群岛',
num: '298'
},
{
name: '斐济',
num: '679'
},
{
name: '芬兰',
num: '358'
},
{
name: '法国',
num: '594'
},
{
name: '法属圭亚那',
num: '45'
},
{
name: '法属波利尼西亚',
num: '689'
},
{
name: '菲律宾',
num: '63'
}
]
},
{
type: 'G',
list: [
{
name: '哥伦比亚',
num: '57'
},
{
name: '哥斯达黎加',
num: '506'
},
{
name: '古巴',
num: '53'
},
{
name: '刚果民主共和国',
num: '243'
},
{
name: '冈比亚',
num: '220'
},
{
name: '格鲁吉亚',
num: '995'
},
{
name: '格陵兰岛',
num: '299'
},
{
name: '格林纳达',
num: '1473'
},
{
name: '瓜德罗普岛',
num: '590'
},
{
name: '关岛',
num: '299'
},
{
name: '瓜地马拉',
num: '502'
},
{
name: '圭亚那',
num: '592'
},
{
name: '刚果共和国',
num: '242'
}
]
},
{
type: 'H',
list: [
{
name: '海地',
num: '509'
},
{
name: '洪都拉斯',
num: '504'
},
{
name: '黑山',
num: '382'
},
{
name: '荷兰',
num: '31'
},
{
name: '韩国',
num: '82'
}
]
},
{
type: 'J',
list: [
{
name: '加拿大',
num: '1'
},
{
name: '日本',
num: '81'
},
{
name: '柬埔寨',
num: '855'
},
{
name: '捷克',
num: '420'
},
{
name: '吉布提',
num: '253'
},
{
name: '加蓬',
num: '241'
},
{
name: '加纳',
num: '233'
},
{
name: '几内亚',
num: '224'
},
{
name: '几内亚比绍共和国',
num: '245'
},
{
name: '基里巴斯',
num: '686'
},
{
name: '吉尔吉斯斯坦',
num: '996'
},
{
name: '津巴布韦',
num: '263'
}
]
},
{
type: 'K',
list: [
{
name: '喀麦隆',
num: '237'
},
{
name: '开普',
num: '238'
},
{
name: '开曼群岛',
num: '1345'
},
{
name: '科摩罗',
num: '269'
},
{
name: '库克群岛',
num: '682'
},
{
name: '克罗地亚',
num: '385'
},
{
name: '库拉索',
num: '599'
},
{
name: '肯尼亚',
num: '254'
},
{
name: '科威特',
num: '965'
},
{
name: '卡塔尔',
num: '974'
},
{
name: '科特迪瓦',
num: '225'
}
]
},
{
type: 'L',
list: [
{
name: '老挝',
num: '856'
},
{
name: '拉脱维亚',
num: '371'
},
{
name: '黎巴嫩',
num: '961'
},
{
name: '莱索托',
num: '266'
},
{
name: '利比里亚',
num: '231'
},
{
name: '利比亚',
num: '218'
},
{
name: '列支敦士登',
num: '423'
},
{
name: '立陶宛',
num: '370'
},
{
name: '卢森堡',
num: '352'
},
{
name: '留尼汪',
num: '262'
},
{
name: '罗马尼亚',
num: '40'
},
{
name: '卢旺达',
num: '423'
}
]
},
{
type: 'M',
list: [
{
name: '美属萨摩亚',
num: '1684'
},
{
name: '孟加拉国',
num: '880'
},
{
name: '马其顿',
num: '389'
},
{
name: '马达加斯加',
num: '261'
},
{
name: '马拉维',
num: '265'
},
{
name: '马来西亚',
num: '60'
},
{
name: '马尔代夫',
num: '960'
},
{
name: '马里',
num: '223'
},
{
name: '马耳他',
num: '356'
},
{
name: '马提尼克',
num: '596'
},
{
name: '毛里塔尼亚',
num: '222'
},
{
name: '毛里求斯',
num: '230'
},
{
name: '墨西哥',
num: '52'
},
{
name: '摩尔多瓦',
num: '373'
},
{
name: '摩纳哥',
num: '377'
},
{
name: '蒙古',
num: '976'
},
{
name: '蒙特塞拉特岛',
num: '1664'
},
{
name: '摩洛哥',
num: '212'
},
{
name: '莫桑比克',
num: '258'
},
{
name: '缅甸',
num: '95'
},
{
name: '美属维尔京群岛',
num: '1284'
}
]
},
{
type: 'N',
list: [
{
name: '纳米比亚',
num: '264'
},
{
name: '尼泊尔',
num: '977'
},
{
name: '尼加拉瓜',
num: '505'
},
{
name: '尼日尔',
num: '227'
},
{
name: '尼日利亚',
num: '234'
},
{
name: '挪威',
num: '47'
},
{
name: '南非',
num: '27'
}
]
},
{
type: 'O',
list: [
{
name: '澳大利亚',
num: '61'
},
{
name: '奥地利',
num: '43'
},
{
name: '澳大利亚',
num: '61'
},
{
name: '澳大利亚',
num: '61'
},
{
name: '澳大利亚',
num: '61'
},
{
name: '澳大利亚',
num: '61'
},
{
name: '澳大利亚',
num: '61'
}
]
},
{
type: 'P',
list: [
{
name: '帕劳',
num: '680'
},
{
name: '葡萄牙',
num: '351'
}
]
},
{
type: 'R',
list: [
{
name: '瑞典',
num: '46'
},
{
name: '瑞士',
num: '41'
}
]
},
{
type: 'S',
list: [
{
name: '塞浦路斯',
num: '357'
},
{
name: '萨尔瓦多',
num: '503'
},
{
name: '圣基茨和尼维斯',
num: '1869'
},
{
name: '圣露西亚',
num: '1758'
},
{
name: '圣皮埃尔岛及密克隆岛',
num: '508'
},
{
name: '圣文森特和格林纳丁斯',
num: '1784'
},
{
name: '萨摩亚',
num: '685'
},
{
name: '圣马力诺',
num: '378'
},
{
name: '圣多美和普林西比',
num: '239'
},
{
name: '沙特阿拉伯',
num: '966'
},
{
name: '塞内加尔',
num: '221'
},
{
name: '塞尔维亚',
num: '381'
},
{
name: '塞舌尔',
num: '248'
},
{
name: '塞拉利昂',
num: '239'
},
{
name: '圣马丁岛(荷兰部分)',
num: '1721'
},
{
name: '斯洛伐克',
num: '421'
},
{
name: '斯洛文尼亚',
num: '386'
},
{
name: '所罗门群岛',
num: '677'
},
{
name: '索马里',
num: '252'
},
{
name: '斯里兰卡',
num: '94'
},
{
name: '苏丹',
num: '249'
},
{
name: '苏里南',
num: '597'
},
{
name: '斯威士兰',
num: '268'
}
]
},
{
type: 'T',
list: [
,
{
name: '塔吉克斯坦',
num: '992'
},
{
name: '坦桑尼亚',
num: '255'
},
{
name: '泰国',
num: '66'
},
{
name: '汤加',
num: '676'
},
{
name: '特立尼达和多巴哥',
num: '1868'
},
{
name: '突尼斯',
num: '216'
},
{
name: '土耳其',
num: '90'
},
{
name: '土库曼斯坦',
num: '993'
},
{
name: '特克斯和凯科斯群岛',
num: '1649'
}
]
},
{
type: 'W',
list: [
{
name: '文莱',
num: '673'
},
{
name: '乌干达',
num: '256'
},
{
name: '乌克兰',
num: '380'
},
{
name: '乌拉圭',
num: '598'
},
{
name: '乌兹别克斯坦',
num: '998'
},
{
name: '瓦努阿图',
num: '678'
},
{
name: '委内瑞拉',
num: '58'
}
]
},
{
type: 'X',
list: [
{
name: '新西兰',
num: '64'
},
{
name: '希腊',
num: '30'
},
{
name: '匈牙利',
num: '36'
},
{
name: '新喀里多尼亚',
num: '687'
},
{
name: '新加坡',
num: '65'
},
{
name: '西班牙',
num: '34'
},
{
name: '叙利亚',
num: '963'
},
{
name: '亚美尼亚',
num: '374'
}
]
},
{
type: 'Y',
list: [
{
name: '英国',
num: '44'
},
{
name: '印度',
num: '91'
},,
{
name: '印度尼西亚',
num: '62'
},,
{
name: '伊朗',
num: '98'
},,
{
name: '伊拉克',
num: '964'
},,
{
name: '以色列',
num: '972'
},,
{
name: '意大利',
num: '39'
},,
{
name: '牙买加',
num: '1876'
},,
{
name: '约旦',
num: '962'
},
{
name: '越南',
num: '84'
},
{
name: '英属处女群岛',
num: '1340'
},
{
name: '也门',
num: '967'
}
]
},
{
type: 'Z',
list: [
{
name: '中国',
num: '86'
},
{
name: '中国香港',
num: '852'
},
{
name: '中国澳门',
num: '853'
},
{
name: '中国台湾',
num: '886'
},
{
name: '中非共和国',
num: '236'
},
{
name: '乍得',
num: '235'
},
{
name: '智利',
num: '56'
},
{
name: '直布罗陀',
num: '350'
},
{
name: '赞比亚',
num: '260'
}
]
}
];
const { currentNav, navs } = this.state;
const { currentNav, data } = this.state;
return (
<>
<HeaderBar title="选择国家和地区" />
<HeaderBar title="选择国家和地区" arrow={true}/>
<ul className="letter-nav">
{navs.map((item, index) => {
{data.map(item => {
return (
<li
key={`nav-${index}`}
className={classnames("letter-nav__item", {"letter-nav__item--active": currentNav === item})}
onClick={() => this.scrollTo(item)}
>{item}</li>
key={`nav-${item['type']}`}
className={classnames("letter-nav__item", {"letter-nav__item--active": currentNav === item['type']})}
onClick={() => this.scrollTo(item['type'])}
>{item['type'] === '0' ? '常' : item['type']}</li>
)
})}
</ul>
......
......@@ -33,7 +33,8 @@ body {
}
.country-item {
margin: 0 12px;
margin-left: 12px;
padding-right: 22px;
}
.country-item__link {
......
......@@ -33,12 +33,8 @@ class Bargain extends Component {
}
// 获取助理好友
getBargainRankList = (id, type) => {
let data = {
courseId: id,
type: type
}
http.post(`${API.home}/m/bargain/rankList`, data).then((res) => {
getBargainRankList = (params = {}) => {
http.post(`${API.home}/m/bargain/rankList`, params).then((res) => {
if (res.data.code === 200) {
this.setState({
list: res.data.data.list,
......@@ -57,20 +53,26 @@ class Bargain extends Component {
courseId: getParam('id')
}
http.post(`${API.home}/m/bargain/courseDetail`, data).then((res) => {
if (res.data.code === 200) {
const { code, data, msg = '' } = res.data;
if (code === 200) {
this.setState({
barInfo: res.data.data,
barInfo: data,
// info: res.data.data,
// limitPeople: res.data.data.limit_people,
// bargainCode: res.data.data.bargain_code
})
if (res.data.data.bargain_status === 0) {
this.getBargainRankList(getParam('id'), 0)
});
// 砍价状态 0-砍价中,1砍价结束,待支付,2砍价过期(没有砍价记录没有砍价信息),3已购买
if (data.bargain_status === 0) {
this.getBargainRankList({
type: 0,
bargain_code: data.bargain_code
});
}
} else {
Toast.info(res.data.msg, 2)
Toast.info(msg, 2);
}
})
});
}
// 查看更多
......
......@@ -461,7 +461,7 @@ class Detail extends Component {
cart={true}
toHref={href}
/>
<CallApp className='toapp'/>
<CallApp className='toapp' path={`/detail/id=${getParam('id')}`} />
{/*弹幕*/}
<Barrage isShow={course_info.is_show}/>
......
......@@ -10,6 +10,8 @@ import Captcha from '@/common/Captcha';
import FollowQRcode from './../followQRcode';
import './index.scss';
import cookie from 'js-cookie'
import { Link } from "react-router-dom";
class RedPacket extends PureComponent {
......@@ -627,7 +629,6 @@ class RedPacket extends PureComponent {
bindInfo,
country
} = this.state;
// console.log(share_code);
const cls = classnames('popup-mask',{
'popup-mask--no': type !== 2
});
......@@ -851,12 +852,12 @@ class RedPacket extends PureComponent {
<Form className="popup-form__content">
<h4 className="popup-form__title">绑定手机号</h4>
<div className="popup-form__item">
<a
<Link
className="popup-form__button--num"
href={`/country?id=${getParam('id')}&share_code=${share_code}`}>
to={`/country?id=${getParam('id')}&share_code=${share_code}`}>
+{country.num}
<i className="iconfont iconiconfront-69"></i>
</a>
<i className="iconfont iconiconfront-69"/>
</Link>
<Field
name="tel"
render={({field}) => {
......
......@@ -7,10 +7,6 @@
color: $color_666;
}
.tel {
margin-bottom: 21px;
}
.verification {
margin-bottom: 21px;
}
......
import React, { Component } from 'react';
import './binding-tel.scss'
import { withFormik, Field, Form } from "formik";
import { validateTel, http, api, getParam } from "@/utils";
import { http, getParam } from "@/utils";
import { compose } from "redux";
import { connect } from "react-redux";
import { setCurrentUser } from "@/store/userAction";
import Captcha from '@/common/Captcha'
import {HeaderBar} from '@/common'
import { HeaderBar } from '@/common'
import ClearableInput from '@common/ClearableInput'
// import ClearableInput from '@common/ClearableInput'
import ClearableInput from '../common/clearableInputWithCountryCodes'
import Button from '../common/Button'
import VeriCodeInput from '../common/veriCodeInput'
import { Toast } from "antd-mobile";
......@@ -42,7 +43,8 @@ class BindingTel extends Component {
render() {
const {
values,
errors
errors,
country
} = this.props
return (
<>
......@@ -59,9 +61,7 @@ class BindingTel extends Component {
setFieldValue={form.setFieldValue}
placeholder={'请输入需要绑定的手机号'}
wrapperClass={'tel'}
icon={<i className={'iconfont iconshouji'}
style={{fontSize: '22px', left: '11px'}}
/>}
country={country}
/>
)
......@@ -77,18 +77,21 @@ class BindingTel extends Component {
icon={<i className={'iconfont iconduanxin'}
style={{fontSize: '20px', left: '12px'}}
/>}
placeholder={'验证码'}
account={values.tel}
tel={values.tel}
challenge={this.state.validate}
instance={this.state.captchaInstance}
action={'auth'}
country={country}
/>
)
}}
/>
<Captcha onVerify={this.onVerify} getInstance={this.getCaptchaInstance}/>
<Button className={'complete-btn'} active={values.tel && values.veriCode && isEmpty(errors)}>完成</Button>
<Button className={'complete-btn'}
active={values.tel && values.veriCode && isEmpty(errors)}>完成</Button>
</Form>
</div>
</>
......@@ -107,7 +110,7 @@ const formikConfig = {
validateOnChange: true,
validate(values) {
let errors = {}
if (!validateTel(values.tel)) {
if (!/\d/.test(values.tel)) {
errors.tel = '请输入正确的手机号'
}
if (!values.veriCode) {
......@@ -120,6 +123,7 @@ const formikConfig = {
phone_num: values.tel,
phone_code: values.veriCode,
mkey: getParam('mkey'),
area_code: props.country.num,
plat: 5
}).then(res => {
const data = res.data
......@@ -135,7 +139,7 @@ const formikConfig = {
stage: 'binding'
})
props.history.replace(`/passport/set-password`)
}else {
} else {
location.assign(data.data['jump_url'])
}
......@@ -143,17 +147,12 @@ const formikConfig = {
} else {
Toast.info(data.msg, 2, null, false)
}
/*props.setCurrentUser({
hasError,
data
})*/
})
}
}
export default compose(
connect(
null,
state => ({country: state.country}),
{setCurrentUser}
),
withFormik(formikConfig),
......
import React, { PureComponent } from 'react';
import { browser } from "@/utils";
import './loginWays.scss'
import more from '../../icons/more.png'
class LoginWays extends PureComponent {
state = {
ways: this.props.loginWays
}
componentDidMount() {
if (!browser.isWeixin) {
this.setState({
ways: this.state.ways.filter(item => item.text !== '微信')
})
}
ways: browser.isWeixin ? this.props.loginWays.slice(0, 2) : this.props.loginWays.slice(0, 1),
showMore: true
}
......@@ -22,6 +15,17 @@ class LoginWays extends PureComponent {
this.props.onClick(text)
}
filterWays = () => {
return browser.isWeixin ? this.props.loginWays : this.props.loginWays.filter(item => item.id !== 'wechat')
}
showMore = () => {
this.setState({
ways: this.filterWays(),
showMore: false
})
}
render() {
return (
<div className="login-ways">
......@@ -31,12 +35,19 @@ class LoginWays extends PureComponent {
this.state.ways.map((item, index) => {
return (
<li key={index} onClick={this.handleClick.bind(this, item.text)}>
<img src={item.logo} alt=""/>
<img src={item.logo} alt={item.text}/>
<p>{item.text}</p>
</li>
)
})
}
{
this.state.showMore &&
<li className={'more'} onClick={this.showMore}>
<img src={more} alt="更多"/>
<p>更多</p>
</li>
}
</ul>
</div>
);
......
import React, { Component } from 'react';
import ClearableInput from '@common/ClearableInput'
import './index.scss'
import { Link } from "react-router-dom";
class ClearableInputWithCountryCodes extends Component {
render() {
const {country, ...rest} = this.props
return (
<div className={'clearable-input-with-country-codes'}>
<div className="country-code">
<Link to={'/country'}>
+{country && country.num || 86}
<i className={'iconfont iconiconfront-69'}/>
</Link>
</div>
<ClearableInput {...rest}/>
</div>
);
}
}
export default ClearableInputWithCountryCodes;
\ No newline at end of file
.clearable-input-with-country-codes {
display: flex;
border: 1px solid #ccc;
border-radius: 3px;
margin-bottom: 24px;
.clearable-input-wrapper {
margin-bottom: 0;
flex: 1 1 auto;
input {
padding-left: 10px;
border: none;
width: 100%;
padding-right: 34px;
}
}
.country-code {
flex-shrink: 0;
display: flex;
justify-content: center;
align-items: center;
font-size: 15px;
color: #333;
width: 63px;
text-align: center;
border-right: 1px solid #ccc;
.iconfont {
margin-left: 3px;
}
}
}
\ No newline at end of file
import React, { Component } from 'react';
import './index.scss'
import Input from '../Input'
import { Link } from "react-router-dom";
class InputWithCountryCodes extends Component {
render() {
const {country, ...rest} = this.props
return (
<div className={'input-with-country-codes'}>
<div className="country-codes">
<Link to={'/country'}>
+{country && country.num || 86}
<i className={'iconfont iconiconfront-69'}/>
</Link>
</div>
<Input {...rest}/>
</div>
);
}
}
export default InputWithCountryCodes;
\ No newline at end of file
.input-with-country-codes {
display: flex;
border: 1px solid #ccc;
border-radius: 3px;
margin-bottom: 24px;
.tel-input {
margin-bottom: 0;
.input {
padding-left: 10px;
border: none;
}
}
.country-codes {
flex-shrink: 0;
display: flex;
justify-content: center;
align-items: center;
font-size: 15px;
color: #333;
width: 63px;
text-align: center;
border-right: 1px solid #ccc;
}
}
\ No newline at end of file
import React, { Component } from 'react';
import './veri-code-input.scss'
import { http, validateEmail, validateTel } from '@/utils';
import { http, validateEmail } from '@/utils';
import { Toast } from "antd-mobile";
import { has } from 'lodash'
......@@ -47,8 +47,8 @@ class VeriCodeInput extends Component {
}
getType = () => {
const {account} = this.props
if (validateEmail(account)) {
const {email} = this.props
if (validateEmail(email)) {
return 'email'
}
}
......@@ -61,9 +61,9 @@ class VeriCodeInput extends Component {
}
sendEmail = () => {
const {account, challenge} = this.props
const {email, challenge} = this.props
http.post(`${API['passport-api']}/send_email_code`, {
email: account,
email,
challenge
}).then(res => {
if (res.data.errno === 0) {
......@@ -79,14 +79,15 @@ class VeriCodeInput extends Component {
}
sendSMS = () => {
const {action, tel, account, challenge, checking} = this.props
if (!tel && !account) {
Toast.info('请输入手机号或邮箱地址')
const {action, tel, account, challenge, checking, country} = this.props
if (!tel) {
Toast.info('请输入手机号')
return
}
http.post(`${API['passport-api']}/quick_sms`, {
phone_num: tel || account,
action: action || 'login',
area_code: country.num,
challenge,
checking
}).then(res => {
......@@ -103,7 +104,7 @@ class VeriCodeInput extends Component {
validate = () => {
const {tel, challenge, account} = this.props
const {tel, challenge, email} = this.props
let hasTel = has(this.props, 'tel')
let content
......@@ -111,15 +112,15 @@ class VeriCodeInput extends Component {
if (!tel) {
content = '手机号码不能为空'
}
if (!validateTel(tel)) {
if (!/\d/.test(tel)) {
content = '请输入正确格式的手机号码'
}
} else {
if (!account) {
content = '手机号或电子邮件不能为空'
if (!email) {
content = '电子邮件不能为空'
}
if (!validateTel(account) && !validateEmail(account)) {
content = '请输入正确格式的手机号或电子邮件'
if (!validateEmail(email)) {
content = '请输入正确格式的电子邮件'
}
}
......
......@@ -4,6 +4,13 @@
.content {
padding: 38px 36px;
text-align: center;
.to-email{
line-height: 55px;
font-size: 15px;
color: #666;
}
}
......@@ -14,10 +21,6 @@
background: #56abff;
}
.tel-input {
margin-bottom: 21px;
}
.verify-code {
margin-bottom: 21px;
}
......@@ -25,4 +28,5 @@
.next_step {
margin-top: 32px;
}
}
\ No newline at end of file
......@@ -6,10 +6,12 @@ import { withFormik, Form, Field } from 'formik';
import { connect } from 'react-redux';
import { compose } from 'redux';
import { Toast } from "antd-mobile";
import { HeaderBar, Captcha, ClearableInput } from "@/common";
import { validateTel, validateEmail, http, api } from "@/utils";
import { HeaderBar, Captcha } from "@/common";
import ClearableInput from '../common/clearableInputWithCountryCodes'
import { http } from "@/utils";
import { quickLogin } from '@/store/userAction';
import OnSubmissionError from '../common/OnSubmissionError'
import { Link } from "react-router-dom";
class ForgotPassword extends Component {
......@@ -42,7 +44,8 @@ class ForgotPassword extends Component {
render() {
const {
values,
isValid
isValid,
country
} = this.props
return (
<div className={'forgot-password'}>
......@@ -50,18 +53,16 @@ class ForgotPassword extends Component {
<div className="content">
<Form className='forgot-password-form'>
<Field
name={'account'}
name={'tel'}
render={({field, form}) => {
return (
<ClearableInput
{...field}
type={'tel'}
placeholder={'请输入注册时的邮箱账号或手机号'}
placeholder={'请输入注册时的手机号'}
wrapperClass={'tel-input'}
setFieldValue={form.setFieldValue}
icon={<i className={'iconfont iconshouji'}
style={{fontSize: '22px', left: '11px'}}
/>}
country={country}
/>)
}}
/>
......@@ -77,11 +78,12 @@ class ForgotPassword extends Component {
icon={<i className={'iconfont iconduanxin'}
style={{fontSize: '20px', left: '12px'}}
/>}
account={values.account}
tel={values.tel}
challenge={this.state.validate}
instance={this.state.captchaInstance}
action={'auth'}
checking={1}
country={country}
/>
)
}}
......@@ -90,6 +92,7 @@ class ForgotPassword extends Component {
<OnSubmissionError callback={this.onSubmissionError}/>
<Captcha getInstance={this.getCaptchaInstance} onVerify={this.onVerify}/>
<Button className={'next_step'} active={isValid}>下一步</Button>
<Link className={'to-email'} to={`/passport/forgot-password-email`} replace>邮箱找回</Link>
</Form>
</div>
</div>
......@@ -101,37 +104,26 @@ class ForgotPassword extends Component {
const formikConfig = {
mapPropsToValues: () => ({
account: '',
tel: '',
veriCode: ''
}),
validateOnChange: true,
validateOnBlur: true,
validate: values => {
let errors = {}
if (!validateTel(values.account) && !validateEmail(values.account)) {
errors.account = '请输入正确的手机号或邮箱地址'
if (!/\d/.test(values.tel)) {
errors.tel = '请输入正确的手机号'
}
values.veriCode.toString().length !== 6 && (errors.veriCode = '验证码格式不正确')
return errors
},
handleSubmit(values, {props}) {
let account, address
if (validateEmail(values.account)) {
account = 'email'
address = 'check_email_code'
sessionStorage.setItem('r_type', 'email')
sessionStorage.setItem('email', values.account)
} else {
account = 'phone'
address = 'check_phone_code'
sessionStorage.setItem('r_type', 'phone')
sessionStorage.setItem('tel', values.account)
}
http.post(`${API['passport-api']}/${address}`, {
[account]: values.account,
code: values.veriCode
sessionStorage.setItem('r_type', 'phone')
sessionStorage.setItem('tel', values.tel)
http.post(`${API['passport-api']}/check_phone_code`, {
phone: values.tel,
code: values.veriCode,
area_code: props.country.num
}).then(res => {
if (res.data.errno == 0) {
props.history.push('/passport/set-password', {from: props.location})
......@@ -145,7 +137,7 @@ const formikConfig = {
export default compose(
connect(
null,
state => ({country: state.country}),
{quickLogin}
),
withFormik(formikConfig)
......
import React, { Component } from 'react'
import './index.scss'
import VeriCodeInput from '../common/veriCodeInput'
import Button from '../common/Button'
import { withFormik, Form, Field } from 'formik';
import { connect } from 'react-redux';
import { compose } from 'redux';
import { Toast } from "antd-mobile";
import { HeaderBar, Captcha, ClearableInput } from "@/common";
import { validateEmail, http, api } from "@/utils";
import { quickLogin } from '@/store/userAction';
import OnSubmissionError from '../common/OnSubmissionError'
import { Link } from "react-router-dom";
class ForgotPassword extends Component {
state = {
validate: null,
captchaInstance: null
}
getCaptchaInstance = instance => {
this.setState({
captchaInstance: instance
})
}
onVerify = (err, data) => {
if (err) {
console.log(err)
} else {
this.setState({
validate: data.validate
})
}
}
onSubmissionError = () => {
const errors = Object.values(this.props.errors);
errors.length && Toast.info(errors[0], 2, null, false)
}
render() {
const {
values,
isValid
} = this.props
return (
<div className={'forgot-password-email'}>
<HeaderBar title='忘记密码' arrow={true}/>
<div className="content">
<Form className='forgot-password-form'>
<Field
name={'email'}
render={({field, form}) => {
return (
<ClearableInput
{...field}
type={'email'}
placeholder={'请输入注册时的邮箱账号'}
wrapperClass={'email-input'}
setFieldValue={form.setFieldValue}
/>)
}}
/>
{
this.state.validate &&
<Field
name='veriCode'
render={({field}) => {
return (
<VeriCodeInput
{...field}
className={'verify-code'}
icon={<i className={'iconfont iconduanxin'}
style={{fontSize: '20px', left: '12px'}}
/>}
email={values.email}
challenge={this.state.validate}
instance={this.state.captchaInstance}
action={'auth'}
checking={1}
/>
)
}}
/>
}
<OnSubmissionError callback={this.onSubmissionError}/>
<Captcha getInstance={this.getCaptchaInstance} onVerify={this.onVerify}/>
<Button className={'next_step'} active={isValid}>下一步</Button>
<Link className={'to-phone'} to={'/passport/forgot-password'} replace>手机号找回</Link>
</Form>
</div>
</div>
);
}
}
const formikConfig = {
mapPropsToValues: () => ({
email: '',
veriCode: ''
}),
validateOnChange: true,
validateOnBlur: true,
validate: values => {
let errors = {}
if (!validateEmail(values.email)) {
errors.email = '请输入正确的邮箱地址'
}
values.veriCode.toString().length !== 6 && (errors.veriCode = '验证码格式不正确')
return errors
},
handleSubmit(values, {props}) {
sessionStorage.setItem('r_type', 'email')
sessionStorage.setItem('email', values.email)
http.post(`${API['passport-api']}/check_email_code`, {
email: values.email,
code: values.veriCode
}).then(res => {
if (res.data.errno == 0) {
props.history.push('/passport/set-password', {from: props.location})
} else {
Toast.info(res.data.msg, 2, null, false)
}
})
},
}
export default compose(
connect(
null,
{quickLogin}
),
withFormik(formikConfig)
)(ForgotPassword)
\ No newline at end of file
.forgot-password-email {
height: 100%;
.content {
padding: 38px 36px;
text-align: center;
.to-phone{
line-height: 55px;
font-size: 15px;
color: #666;
}
.email-input{
margin-bottom: 21px;
input{
padding-left: 10px;
}
}
}
.place {
width: 100%;
height: 39px;
margin-bottom: 33px;
background: #56abff;
}
.verify-code {
margin-bottom: 21px;
}
.next_step {
margin-top: 32px;
}
}
\ No newline at end of file
......@@ -8,14 +8,15 @@ import AccountLogin from './accountLogin'
import ForgotPassword from './forgotPassword'
import SetPassword from './setPassword'
import BindingTel from './bindingTel'
import ForgotPasswordEmail from './forgotPasswordEmail'
import { connect } from "react-redux";
import { compose } from "redux";
import {getParam} from "@/utils";
import account from './account.png'
import qq from './qq.png'
import sina from './sina.png'
import wechat from './wechat.png'
import { getParam } from "@/utils";
import account from './icons/account.png'
import qq from './icons/qq.png'
import sina from './icons/sina.png'
import wechat from './icons/wechat.png'
class Passport extends Component {
......@@ -32,23 +33,27 @@ class Passport extends Component {
loginWays: [
{
logo: account,
text: '账号登录'
text: '账号登录',
id: 'account'
},
{
logo: wechat,
text: '微信',
url: ''
url: '',
id: 'wechat'
},
{
logo: qq,
text: 'QQ',
url: `${API["passport-api"]}/mob/qqlogin?redirect_url=${this.redirectURL}`
url: `${API["passport-api"]}/mob/qqlogin?redirect_url=${this.redirectURL}`,
id: 'qq'
},
{
logo: sina,
text: '新浪',
url: `${API['passport-api']}/mob/sinalogin?redirect_url=${this.redirectURL}`
},
url: `${API['passport-api']}/mob/sinalogin?redirect_url=${this.redirectURL}`,
id: 'sina'
}
]
}
}
......@@ -95,6 +100,7 @@ class Passport extends Component {
}}/>
<Route path={match.url + '/account-login'} component={AccountLogin}/>
<Route path={match.url + '/forgot-password'} component={ForgotPassword}/>
<Route path={match.url + '/forgot-password-email'} component={ForgotPasswordEmail}/>
<Route path={match.url + '/set-password'} component={SetPassword}/>
<Route path={match.url + '/binding-tel'} component={BindingTel}/>
</Switch>
......
import React, { Component } from 'react'
import './wechatLogin.scss'
import Input from "../common/Input"
// import Input from "../common/Input"
import Input from '../common/inputWithCountryCodes'
import LoginButton from '../common/LoginButton'
import LoginWays from '../common/LoginWays'
import Header from '../common/Header'
......@@ -12,7 +13,6 @@ import { connect } from 'react-redux';
import { compose } from 'redux';
import { isEmpty } from 'lodash'
import { Toast } from 'antd-mobile';
import { validateTel, getParam } from "@/utils";
import { HeaderBar } from "@/common";
......@@ -69,7 +69,8 @@ class Login extends Component {
const {
loginWays,
errors,
values
values,
country
} = this.props
return (
<div className='login'>
......@@ -84,9 +85,7 @@ class Login extends Component {
type={'tel'}
placeholder={'手机号快捷登录(免注册)'}
wrapperClass={'tel-input'}
icon={<i className={'iconfont iconshouji'}
style={{fontSize: '22px', left: '10px'}}
/>}
country={country}
/>
)}
>
......@@ -108,6 +107,7 @@ class Login extends Component {
errors={errors}
placeholder={'请输入验证码'}
instance={this.state.captchaInstance}
country={country}
/>
)}
/>
......@@ -132,7 +132,8 @@ const FormikConfig = {
handleSubmit(values, {props}) {
props.quickLogin({
phone_num: values.tel,
phone_code: values.veriCode
phone_code: values.veriCode,
area_code: props.country.num
}).then(res => {
if (res.hasError) {
Toast.info(res.msg);
......@@ -146,7 +147,7 @@ const FormikConfig = {
validateOnChange: true,
validate: (values) => {
let errors = {}
if (!validateTel(values.tel)) {
if (!/\d/.test(values.tel)) {
errors.tel = '请填写正确格式的手机号'
}
if (!/[0-9]{6}/.test(values.veriCode)) {
......@@ -158,7 +159,7 @@ const FormikConfig = {
export default compose(
connect(
null,
state => ({country: state.country}),
{quickLogin}
),
withFormik(FormikConfig),
......
......@@ -8,9 +8,9 @@
padding: 0 38px;
flex: 1 0 auto;
.tel-input {
/*.tel-input {
margin-bottom: 24px;
}
}*/
.verification{
margin-bottom: 24px;
......
......@@ -16,6 +16,7 @@ import { connect } from "react-redux";
class SetPassword extends Component {
render() {
let {values, errors, location} = this.props
let {from} = location.state || {from: {pathname: '/'}}
......
......@@ -12,16 +12,19 @@ class Search extends PureComponent {
state = {
searchHistory: JSON.parse(localStorage.getItem('searchHistory')) || [],
hot_words: [],
defaultWord: '',
searchList: [],
value: '',
isLoading: true
}
async componentDidMount() {
const res = await http.get(`${API['search-api']}/search_hot_word`)
if (res.data.errno === 0) {
const res = await http.get(`${API['search-api']}/search_hot_word`);
const { errno, data } = res.data;
if (errno === 0) {
this.setState({
hot_words: res.data.data.info.hot_words,
hot_words: data.info.hot_words,
defaultWord: data.info.recommend_word,
isLoading: false
})
}
......@@ -39,11 +42,15 @@ class Search extends PureComponent {
}
handleSearch = () => {
this.state.value && this.props.history.push(`/search-result?word=${encodeURIComponent(this.state.value)}`)
const { defaultWord, value } = this.state;
const val = value || defaultWord;
val && this.props.history.push(`/search-result?word=${encodeURIComponent(val)}`)
}
storeHistory = keyword => {
localStorage.setItem('searchHistory', JSON.stringify([...this.state.searchHistory, keyword]))
const { searchHistory } = this.state;
const data = searchHistory.some(item => item === keyword)? searchHistory : searchHistory.concat([keyword]);
localStorage.setItem('searchHistory', JSON.stringify(data));
}
......@@ -53,7 +60,7 @@ class Search extends PureComponent {
<div className="search-page">
<SearchHead
searchHistory={this.state.searchHistory}
value={this.state.value}
value={this.state.value || this.state.defaultWord}
handleChange={this.handleChange}
handleSearch={this.handleSearch}
/>
......
......@@ -25,8 +25,10 @@ class SearchHead extends PureComponent {
}
storeKeyword = () => {
let {searchHistory = [], value} = this.props
value && localStorage.setItem('searchHistory', JSON.stringify([...searchHistory, value]))
const {searchHistory = [], value} = this.props;
const data = searchHistory.some(item =>item === value)? searchHistory : searchHistory.concat([value]);
// value && localStorage.setItem('searchHistory', JSON.stringify([...searchHistory, value]))
localStorage.setItem('searchHistory', JSON.stringify(data));
}
changeFontColor = (isFocus) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment