1.login文件下index.js
(登陆组件)
/*
* @Author: YangXing
* @Date: 2018-01-25 17:37:22
* @Last Modified by: YangXing
* @Last Modified time: 2018-01-26 12:29:31
*/
import React from 'react';
import MUtil from 'util/mm.jsx'
import User from 'service/user-service.jsx'
const _mm = new MUtil();
const _user = new User();
import './index.scss';
class Login extends React.Component{
constructor(props){
super(props);
this.state = {
username: '',
password: '',
redirect: _mm.getUrlParam('redirect') || '/'
}
}
componentWillMount(){
document.title = '登录 - MMALL ADMIN';
}
// 当用户名发生改变
onInputChange(e){
let inputValue = e.target.value,
inputName = e.target.name;
this.setState({
[inputName] : inputValue
});
}
onInputKeyUp(e){
if(e.keyCode === 13){
this.onSubmit();
}
}
// 当用户提交表单
onSubmit(){
let loginInfo = {
username : this.state.username,
password : this.state.password
},
checkResult = _user.checkLoginInfo(loginInfo);
// 验证通过
if(checkResult.status){
_user.login(loginInfo).then((res) => {
_mm.setStorage('userInfo', res);
this.props.history.push(this.state.redirect);
}, (errMsg) => {
_mm.errorTips(errMsg);
});
}
// 验证不通过
else{
_mm.errorTips(checkResult.msg);
}
}
render(){
return (
<div className="col-md-4 col-md-offset-4">
<div className="panel panel-default login-panel">
<div className="panel-heading">欢迎登录 - MMALL管理系统</div>
<div className="panel-body">
<div>
<div className="form-group">
<input type="text"
name="username"
className="form-control"
placeholder="请输入用户名"
onKeyUp={e => this.onInputKeyUp(e)}
onChange={e => this.onInputChange(e)}/>
</div>
<div className="form-group">
<input type="password"
name="password"
className="form-control"
placeholder="请输入密码"
onKeyUp={e => this.onInputKeyUp(e)}
onChange={e => this.onInputChange(e)}/>
</div>
<button className="btn btn-lg btn-primary btn-block"
onClick={e => {this.onSubmit(e)}}>登录</button>
</div>
</div>
</div>
</div>
);
}
}
export default Login;
2.封装请求的方法类文件(基于jquery)
mm.jsx
文件
/*
* @Author: YangXing
* @Date: 2018-01-23 22:54:28
* @Last Modified by: YangXing
* @Last Modified time: 2018-01-31 14:21:22
*/
class MUtil{
request(param){
return new Promise((resolve, reject) => {
$.ajax({
type : param.type || 'get',
url : param.url || '',
dataType : param.dataType || 'json',
data : param.data || null,
success : res => {
// 数据请求成功
if(0 === res.status){
typeof resolve === 'function' && resolve(res.data, res.msg);
}
// 没有登录状态,强制登录
else if(10 === res.status){
this.doLogin();
}
else{
typeof reject === 'function' && reject(res.msg || res.data);
}
},
error : err => {
typeof reject === 'function' && reject(err.statusText);
}
});
});
}
// 跳转登录
doLogin(){
window.location.href = '/login?redirect=' + encodeURIComponent(window.location.pathname);
}
// 获取URL参数
getUrlParam(name){
// param=123¶m1=456
let queryString = window.location.search.split('?')[1] || '',
reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"),
result = queryString.match(reg);
return result ? decodeURIComponent(result[2]) : null;
}
// 成功提示
successTips(successMsg){
alert(successMsg || '操作成功!');
}
// 错误提示
errorTips(errMsg){
alert(errMsg || '好像哪里不对了~');
}
// 本地存储
setStorage(name, data){
let dataType = typeof data;
// json对象
if(dataType === 'object'){
window.localStorage.setItem(name, JSON.stringify(data));
}
// 基础类型
else if(['number','string','boolean'].indexOf(dataType) >= 0){
window.localStorage.setItem(name, data);
}
// 其他不支持的类型
else{
alert('该类型不能用于本地存储');
}
}
// 取出本地存储内容
getStorage(name){
let data = window.localStorage.getItem(name);
if(data){
return JSON.parse(data);
}
else{
return '';
}
}
// 删除本地存储
removeStorage(name){
window.localStorage.removeItem(name);
}
}
export default MUtil;
3.封装求情的函数(get,post,delete,update)
user-service.jsx
文件
/*
* @Author: YangXing
* @Date: 2018-01-25 21:21:46
* @Last Modified by: YangXing
* @Last Modified time: 2018-01-31 13:33:42
*/
import MUtil from 'util/mm.jsx'
const _mm = new MUtil();
class User{
// 用户登录
login(loginInfo){
return _mm.request({
type: 'post',
url: '/manage/user/login.do',
data: loginInfo
});
}
// 检查登录接口的数据是不是合法
checkLoginInfo(loginInfo){
let username = $.trim(loginInfo.username),
password = $.trim(loginInfo.password);
// 判断用户名为空
if(typeof username !== 'string' || username.length ===0){
return {
status: false,
msg: '用户名不能为空!'
}
}
// 判断密码为空
if(typeof password !== 'string' || password.length ===0){
return {
status: false,
msg: '密码不能为空!'
}
}
return {
status : true,
msg : '验证通过'
}
}
// 退出登录
logout(){
return _mm.request({
type : 'post',
url : '/user/logout.do'
});
}
getUserList(pageNum){
return _mm.request({
type : 'post',
url : '/manage/user/list.do',
data : {
pageNum : pageNum
}
});
}
}
export default User;
4.index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewPort" content="width=device-width,initial-scale=1">
<meta name="author" content="Rosen">
<title>HAPPY MMALL</title>
<link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link href="http://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
<div id="app"></div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</body>
</html>
5.app.js
/*
* @Author: YangXing
* @Date: 2018-01-13 11:27:21
* @Last Modified by: YangXing
* @Last Modified time: 2018-02-05 14:02:20
*/
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Switch, Redirect, Route, Link } from 'react-router-dom'
import Layout from 'component/layout/index.jsx';
// 页面
import Home from 'page/home/index.jsx';
import ProductRouter from 'page/product/router.jsx';
import Login from 'page/login/index.jsx';
import OrderList from 'page/order/index.jsx';
import OrderDetail from 'page/order/detail.jsx';
import UserList from 'page/user/index.jsx';
import ErrorPage from 'page/error/index.jsx';
class App extends React.Component{
render(){
let LayoutRouter = (
<Layout>
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/product" component={ProductRouter}/>
<Route path="/product-category" component={ProductRouter}/>
<Route path="/order/index" component={OrderList}/>
<Route path="/order/detail/:orderNumber" component={OrderDetail}/>
<Route path="/user/index" component={UserList}/>
<Redirect exact from="/order" to="/order/index"/>
<Redirect exact from="/user" to="/user/index"/>
<Route component={ErrorPage}/>
</Switch>
</Layout>
);
return (
<Router>
<Switch>
<Route path="/login" component={Login}/>
<Route path="/" render={ props => LayoutRouter}/>
</Switch>
</Router>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('app')
);