add UnauthorizedCode
authorHongyuan Ma <CS_MaleicAcid@163.com>
Sun, 8 Jul 2018 03:50:28 +0000 (11:50 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Sun, 8 Jul 2018 03:50:28 +0000 (11:50 +0800)
13 files changed:
front-end/src/app.jsx
front-end/src/component/nav-top/index.jsx
front-end/src/page/portal/index.jsx
front-end/src/service/user-service.jsx
front-end/src/util/constant.jsx
front-end/src/util/util.jsx
web/apps/test_records/views.py
web/apps/user_operation/views.py
web/apps/util/__init__.py [new file with mode: 0644]
web/apps/util/exception_handler.py [new file with mode: 0644]
web/apps/util/response.py [new file with mode: 0644]
web/pgperffarm/settings.py
web/pgperffarm/urls.py

index c2f23ec451f74e203232e8cf7a1a2e9b950ec890..78443b1b68a05ccc185d460d12923b500b8325e3 100644 (file)
@@ -1,6 +1,6 @@
 import React from 'react';
 import ReactDom from 'react-dom';
-import {HashRouter as Router, Route, Link, Redirect, Switch} from 'react-router-dom';
+import {BrowserRouter as Router, Route, Link, Redirect, Switch} from 'react-router-dom';
 import createHistory from 'history/createHashHistory'
 const history = createHistory()
 import {spring, AnimatedRoute, AnimatedSwitch} from 'react-router-transition';
index 69157fc4f66adf05eef7fedef0a90a2240a5e800..f4740757a57180ee44e8e2f0045aa34a5ae8dd7f 100644 (file)
@@ -18,13 +18,9 @@ class NavTop extends React.Component {
     }
 
     // logout
-    onLogout(){
-        _user.logout().then(res => {
-            _util.removeStorage('userInfo');
-            window.location.href = '/login';
-        }, errMsg => {
-            _util.errorTips(errMsg);
-        });
+    onLogout() {
+        _util.removeStorage('userInfo');
+        window.location.href = '/login';
     }
 
     render() {
@@ -34,19 +30,20 @@ class NavTop extends React.Component {
         if (isLoggedIn) {
             button = <li className="dropdown loggedin">
                 <a className="dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="false">
-                    <img className="img-circle img-thumbnail user-head-pic" src={require('image/slonik.png')} alt="headPic"/>
+                    <img className="img-circle img-thumbnail user-head-pic" src={require('image/slonik.png')}
+                         alt="headPic"/>
                 </a>
                 <ul className="dropdown-menu dropdown-alerts loggedin-ul">
                     <li>
-                        <a href="#">
+                        <Link to="/portal">
                             <div>
                                 <i className="fa fa-tasks fa-fw"></i> My machines
                             </div>
-                        </a>
+                        </Link>
                     </li>
                     <li className="divider"></li>
                     <li>
-                        <a href="#">
+                        <a onClick={() => {this.onLogout()}}>
                             <div>
                                 <i className="fa fa-upload fa-fw"></i> Log out
                             </div>
@@ -71,7 +68,8 @@ class NavTop extends React.Component {
                         Farm</b></a>
                 </div>
                 <ul className="nav navbar-top-links navbar-left">
-                    <li><Link to="/home"> <span className="glyphicon glyphicon-home" aria-hidden="true"></span> Home</Link>
+                    <li><Link to="/home"> <span className="glyphicon glyphicon-home" aria-hidden="true"></span>
+                        Home</Link>
                     </li>
                     <li><Link to="/status"><span className="glyphicon glyphicon-tasks" aria-hidden="true"></span>Status</Link>
                     </li>
index fe4ecfed77278682299915019af24b58b93e5fce..3f9b6cba6e05a14949cd8bd6b96979310e9e4d96 100644 (file)
@@ -32,7 +32,7 @@ class Portal extends React.Component {
                 userinfo: res.userinfo,
             });
         }, errMsg => {
-            _mm.errorTips(errMsg);
+            _util.errorTips(errMsg);
         });
     }
 
@@ -44,9 +44,19 @@ class Portal extends React.Component {
                 isLoading: false
             });
         }, errMsg => {
-            _mm.errorTips(errMsg);
+            _util.errorTips(errMsg);
         });
     }
+    onLogout(){
+        _util.removeStorage('userInfo');
+        window.location.href = '/login';
+        // _user.logout().then(res => {
+        //     _util.removeStorage('userInfo');
+        //     window.location.href = '/login';
+        // }, errMsg => {
+        //     _util.errorTips(errMsg);
+        // });
+    }
 
     render() {
         let show = this.state.isLoading ? "none" : "block";
@@ -72,7 +82,7 @@ class Portal extends React.Component {
                             <a href="\add-machine" className="list-group-item">
                                 <i className="fa fa-globe fa-fw"></i>&nbsp; Add a New Mchine
                             </a>
-                            <a href="\logout" className="list-group-item">
+                            <a onClick={() => {this.onLogout()}} className="list-group-item">
                                 <i className="fa fa-arrow-left fa-fw"></i>&nbsp; Logout
                             </a>
                         </div>
index bbb600e736a236394fc19b1e654a299044cd2488..997632bf9e533426a554d246a1bee7bf01bfc180 100644 (file)
@@ -37,11 +37,12 @@ class User{
     }
     // logout
     logout(){
-        let url = PGConstant.base_url + '/logout';
-        return _util.request({
-            type    : 'post',
-            url     : url
-        });
+        // let url = PGConstant.base_url + '/logout';
+        // return _util.request({
+        //     type    : 'post',
+        //     url     : url
+        // });
+        return true;
     }
 
     getUserMachineManageList(pageNum){
index 6e8c9a8af58ec7f5585bebdf56edb9bb35adb1d6..2c0e3fb9c726802760215a1d4401afd989f6b517 100644 (file)
@@ -3,7 +3,7 @@ const object = {
 
 
     name:'好123',
-    USER_UNLOGIN_CODE:10,
+    UnauthorizedCode:401,// unlogin
 
 };
 export default object;
\ No newline at end of file
index 3492750c7f0c12980f36b80035602ee8164ee88f..4c69ef98998ccd7e60d1fb6ddfd79c59c33b8025 100644 (file)
@@ -1,50 +1,58 @@
-
 import PGConstant from 'util/constant.jsx'
 // const _const = new PGConstant();
 class PGUtil {
     request(param) {
         return new Promise((resolve, reject) => {
             let user = this.getStorage('userInfo')
+            let beforeSendFunc = (xhr) => {}
+            if (user.token) {
+                beforeSendFunc = (xhr) => xhr.setRequestHeader("Authorization", 'Token ' + user.token);
+            }
             $.ajax({
                 type: param.type || 'get',
                 url: param.url || '',
                 dataType: param.dataType || 'json',
                 data: param.data || null,
-                headers:{
-                    'Authorization': 'Token ' + user.token
-                },
+                // headers: {
+                //     'Authorization': 'Token ' + user.token
+                // },
+                beforeSend: beforeSendFunc,
                 success: res => {
                     // request success
-
+                    console.dir(res)
                     typeof resolve === 'function' && resolve(res, res.msg);
                     if (0 === res.status) {
                         typeof resolve === 'function' && resolve(res.data, res.msg);
-                    }
-                    // nologin force to login
-                    else if (PGConstant.USER_UNLOGIN_CODE === res.status) {
-                        this.doLogin();
-                    }
-                    else {
+                    } else {
                         typeof reject === 'function' && reject(res.msg || res.data);
                     }
                 },
                 error: err => {
-                    typeof reject === 'function' && reject(err.statusText);
+                    console.log('here is err')
+                    console.dir(err.status)
+                    // nologin force to login
+                    if (PGConstant.UnauthorizedCode === err.status) {
+                        this.doLogin();
+                    } else {
+                        typeof reject === 'function' && reject(err.statusText);
+                    }
+
                 }
             });
         });
     }
 
     // redirect to login
-    doLogin(){
+    doLogin() {
         window.location.href = '/login?redirect=' + encodeURIComponent(window.location.pathname);
+        // window.location.href = '/login';
     }
 
-    getUrlParam(name){
+    getUrlParam(name) {
         // param=123&param1=456
         let queryString = window.location.search.split('?')[1] || '',
-            reg         = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"),
-            result      = queryString.match(reg);
+            reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"),
+            result = queryString.match(reg);
         return result ? decodeURIComponent(result[2]) : null;
     }
 
@@ -93,11 +101,11 @@ class PGUtil {
 
     getDateStr(AddDayCount) {
         let dd = new Date();
-        dd.setDate(dd.getDate()+AddDayCount);
+        dd.setDate(dd.getDate() + AddDayCount);
         let y = dd.getFullYear();
-        let m = (dd.getMonth()+1)<10?"0"+(dd.getMonth()+1):(dd.getMonth()+1);
-        let d = dd.getDate()<10?"0"+dd.getDate():dd.getDate();
-        return y+"-"+m+"-"+d;
+        let m = (dd.getMonth() + 1) < 10 ? "0" + (dd.getMonth() + 1) : (dd.getMonth() + 1);
+        let d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate();
+        return y + "-" + m + "-" + d;
     }
 }
 
index e5fcfa36bd357738fa8fbdf41e19f1a03db38459..10ce25fbc939168759204aca20e251afb4732d17 100644 (file)
@@ -36,6 +36,7 @@ class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
     """
     List test records
     """
+
     queryset = TestRecord.objects.all().order_by('add_time')
     serializer_class = TestRecordListSerializer
     pagination_class = StandardResultsSetPagination
index fb46d05f053561f5a3c3886b09bc57c6afb73e89..6c2d71aaa2e03b41c265cd69d12adfdb8692c5e5 100644 (file)
@@ -2,11 +2,13 @@
 from __future__ import unicode_literals
 
 from django.shortcuts import render
-from rest_framework import mixins, viewsets, permissions
+from rest_framework import mixins, viewsets, permissions, status
 
 from rest_framework import authentication
+from rest_framework.response import Response
+from rest_framework.views import APIView
 from rest_framework_jwt.authentication import JSONWebTokenAuthentication
-
+from util.response import PGJsonResponse
 from models import UserMachine
 from serializer import UserMachineManageSerializer
 
@@ -21,12 +23,25 @@ class UserMachineListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
     serializer_class = UserMachineManageSerializer
     # pagination_class = StandardResultsSetPagination
 
+
+
+# class UserMachineList(APIView):
+#     authentication_classes = (JSONWebTokenAuthentication,)
+#     permission_classes = (permissions.IsAuthenticated,)
+#
+#     def get(self, request, format=None):
+#         machines = UserMachine.objects.all().order_by('add_time')
+#         serializer = UserMachineManageSerializer(machines, many=True)
+#
+#         return PGJsonResponse(data=serializer.data, code=status.HTTP_200_OK, desc='get user machine list success')
+
+
 class UserMachinePermission(permissions.BasePermission):
     """
-    Machine permission check
+    Machine upload permission check
     """
 
     def has_permission(self, request, view):
         secret = request.data.secret
-        ret = UserMachine.objects.filter(machine_secret=secret,is_active=1).exists()
-        return ret
\ No newline at end of file
+        ret = UserMachine.objects.filter(machine_secret=secret, is_active=1).exists()
+        return ret
diff --git a/web/apps/util/__init__.py b/web/apps/util/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/web/apps/util/exception_handler.py b/web/apps/util/exception_handler.py
new file mode 100644 (file)
index 0000000..b5d4e62
--- /dev/null
@@ -0,0 +1,16 @@
+from rest_framework.views import exception_handler
+
+
+def custom_exception_handler(exc, context):
+    # Call REST framework's default exception handler first,
+    # to get the standard error response.
+    response = exception_handler(exc, context)
+
+    # Now add the HTTP status code to the response.
+    if response is not None:
+        response.data['code'] = response.status_code
+        response.data['desc'] = response.data['detail']
+        # response.data['data'] = None #可以存在
+        del response.data['detail']  # 删除detail字段
+
+    return response
diff --git a/web/apps/util/response.py b/web/apps/util/response.py
new file mode 100644 (file)
index 0000000..c47f41b
--- /dev/null
@@ -0,0 +1,38 @@
+from django.utils import six
+from rest_framework.response import Response
+from rest_framework.serializers import Serializer
+
+class PGJsonResponse(Response):
+    """
+    An HttpResponse that allows its data to be rendered into
+    arbitrary media types.
+    """
+
+    def __init__(self, data=None, code=None, desc=None,
+                 status=None,
+                 template_name=None, headers=None,
+                 exception=False, content_type=None):
+        """
+        Alters the init arguments slightly.
+        For example, drop 'template_name', and instead use 'data'.
+        Setting 'renderer' and 'media_type' will typically be deferred,
+        For example being set automatically by the `APIView`.
+        """
+        super(Response, self).__init__(None, status=status)
+
+        if isinstance(data, Serializer):
+            msg = (
+                'You passed a Serializer instance as data, but '
+                'probably meant to pass serialized `.data` or '
+                '`.error`. representation.'
+            )
+            raise AssertionError(msg)
+
+        self.data = {"code": code, "desc": desc, "data": data}
+        self.template_name = template_name
+        self.exception = exception
+        self.content_type = content_type
+
+        if headers:
+            for name, value in six.iteritems(headers):
+                self[name] = value
\ No newline at end of file
index 2a62143b2e6dc3041497b26a7f35086b4c5ffede..d3b5f42e275ae07d571fde5c8efd8801764777cd 100644 (file)
@@ -132,7 +132,9 @@ REST_FRAMEWORK = {
     # ),
 
     # 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
-
+    # 'EXCEPTION_HANDLER': (
+    #     'dataAPI.common.api_exception.custom_exception_handler'
+    # ),
     'DEFAULT_AUTHENTICATION_CLASSES': (
         'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
         'rest_framework.authentication.BasicAuthentication',
@@ -144,9 +146,9 @@ REST_FRAMEWORK = {
 }
 
 DB_ENUM = {
-    "mode":{
-        "simple":1,
-        "other":2
+    "mode": {
+        "simple": 1,
+        "other": 2
     },
     "status": {
         "none": -1,
@@ -158,7 +160,6 @@ DB_ENUM = {
 
 APPEND_SLAS = False
 
-
 CORS_ALLOW_CREDENTIALS = True
 CORS_ORIGIN_ALLOW_ALL = True
 CORS_ORIGIN_WHITELIST = (
@@ -192,7 +193,7 @@ ALLOWED_HOSTS = ['*']
 
 JWT_AUTH = {
     'JWT_RESPONSE_PAYLOAD_HANDLER':
-    'users.jwt_handler.jwt_response_payload_handler',
+        'users.jwt_handler.jwt_response_payload_handler',
     'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=7200),
     'JWT_AUTH_HEADER_PREFIX': 'Token',
-}
\ No newline at end of file
+}
index e3b3d52fa29b73787d3bbf3fb03116cf09813fe4..e9a659dd78628e8feec5953c9ea6d605a04bdee5 100644 (file)
@@ -58,6 +58,8 @@ urlpatterns = [
     # url(r'status/$', TestListView.as_view(), name='test-list'),
     # url(r'detail', TestRecordDetailViewSet ,name="detail"),
     url(r'upload/$', TestRecordCreate, name='test-upload'),
+    # url(r'my-machine/$', UserMachineList.as_view(), name='my-machine'),
+
     url(r'docs/', include_docs_urls(title='pgperffarm')),
     # Static pages
     # url(r'^$', 'pgperffarm.views.index', name='index'),