import React, {Component} from 'react' import Routes from './router' import cookie from 'js-cookie' import {connect} from "react-redux"; import {setCurrentUser, startFetchUser} from "@/store/userAction"; import {withRouter} from 'react-router-dom' import {compose} from 'redux' import {getParam, http, browser} from "@/utils"; import {Toast} from "antd-mobile"; import {addDays} from 'date-fns' //拦截ajax请求,返回mock数据 /*import mock from '@/utils/mock' mock()*/ // 默认样式 import './assets/css/index.scss'; // iconfont import './assets/font/iconfont.css'; class App extends Component { previousLocation = { ...{ state: { from: { pathname: this.props.location.pathname, search: this.props.location.search, hash: this.props.location.hash } } }, ...this.props.location } records = [] firstLoad = true componentDidMount() { // 友盟统计 const script = document.createElement('script'); script.src = 'https://s22.cnzz.com/z_stat.php?id=1265696973&web_id=1265696973'; script.language = 'JavaScript'; document.body.appendChild(script); this.setNavigationRecord(this.props.location, this.props.history.action) //平台信息 cookie.set('plat', '5', {domain: '.julyedu.com'}) if (browser.isWeixin && browser.isIOS) { sessionStorage.setItem('enter_url', window.location.href) } this.getUser() this.utm() const routeMatchRule = /binding-tel|forgot|set-password/ const {history} = this.props history.listen((location, action) => { this.utm() this.firstLoad = false this.setNavigationRecord(location, action) if (cookie.get('uid') && this.props.user.hasError) { this.getUser() } const {pathname} = location if (pathname.startsWith('/passport')) { if (routeMatchRule.test(pathname)) { return } location.state = {...location.state, ...{from: this.previousLocation}}; } else { this.removeShareCodeCookie() } }) } removeShareCodeCookie = () => { cookie.remove('share_code', {path: '/', domain: '.julyedu.com'}) } 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.length > 1 && (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? location.state = {...location.state, records: this.records} : (location.state = {records: this.records}) } utm = () => { // utm统计 m站全站统计广告投放、以及统计详情页浏览 let utm_source = getParam('utm_source') let utm_medium = getParam('utm_medium') let utm_campaign = getParam('utm_campaign') let utm_content = getParam('utm_content') let utm_term = getParam('utm_term') let courseId = location.pathname.startsWith('/getDetail') || location.pathname.startsWith('/detail') ? getParam('id') : 0 if (courseId || (utm_term && utm_source && utm_medium && utm_campaign && utm_content)) { let data = { 'utm_source': utm_source, 'utm_medium': utm_medium, 'utm_campaign': utm_campaign, 'utm_content': utm_content, 'utm_term': utm_term, } http.post(`${API['www']}/base/first_utm_record/${courseId}`, data) .then(res => { }) } } getUser = () => { this.props.startFetchUser() http.get(`${API.home}/m/user_info`).then(res => { this.props.setCurrentUser(this.transformUser(res)) }) //微信 let code = getParam('code') let oid = getParam('oid') if (code && !oid) { http.get(`${API['home']}/m/wx_loginInfo/code/${code}`) .then(res => { let data = res.data if (data.errno == 200) { if (data.data['is_bind_mobile']) { window.location.assign(data.data.url) } else { let user = this.transformWxUser(res) let {role, uid, token} = data.data let expires = addDays(new Date(), 90) cookie.set('role', role, {expires, domain: '.julyedu.com', path: '/'}) cookie.set('uid', uid, {expires, domain: '.julyedu.com', path: '/'}) cookie.set('token', token, {expires, domain: '.julyedu.com', path: '/'}) this.props.setCurrentUser(user) } } else { Toast.info(data.msg) } }) } } componentDidUpdate() { 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 if (res.data.code === 200) { //移除红包统计cookie this.removeShareCodeCookie() const { msg, data: { avatar_file: avatar, user_name: username, is_vip: isVIP, uid, code } } = res.data payload = { hasError: false, msg, data: { username, isVIP, avatar, uid, code } } } else { payload = { hasError: true, msg: res.data.msg, code: res.data.code, data: {} } } return payload } transformWxUser = res => { let data = res.data if (data.errno == 200) { //移除红包统计cookie this.removeShareCodeCookie() let {uid, token, avatar_file: avatar, uname: username,} = data.data return { hasError: false, data: { uid, token, avatar, username }, msg: data.msg } } else { let {code, msg} = data.data return { code, msg, hasError: true, data: {} } } } render() { return <Routes/> } } export default compose( connect( state => ({user: state.user}), {setCurrentUser, startFetchUser} ), withRouter )(App)