Quellcode durchsuchen

实现密码找回功能

James Iter vor 8 Jahren
Ursprung
Commit
ddd936388f
6 geänderte Dateien mit 83 neuen und 52 gelöschten Zeilen
  1. 1 1
      api/user.py
  2. 1 1
      docs/todo.md
  3. 45 0
      templates/failure.html
  4. 4 47
      templates/reset_password.html
  5. 31 2
      views/misc.py
  6. 1 1
      views_route_table.py

+ 1 - 1
api/user.py

@@ -136,7 +136,7 @@ def r_reset_password(token):
         ji.Check.previewing(args_rules, user.__dict__)
         user.password = ji.Security.ji_pbkdf2(user.password)
         user.update()
-    except ji.PreviewingError, e:
+    except (ji.PreviewingError, ji.JITError), e:
         return json.loads(e.message)
 
 

+ 1 - 1
docs/todo.md

@@ -44,7 +44,7 @@
 - [ ] 日志里面加入操作轨迹
 - [x] 日志实现简短字段及详情字段,详情字段用text,存储完整的日志文本。因为日志太长,无法在简短日志字段存放完整。
 - [x] 修改密码功能
-- [ ] 密码[找回|重置]功能
+- [x] 密码[找回|重置]功能
 - [ ] 前端页面校验字段有效值
 - [ ] 当计算节点离线时,计算节点页面显示,清除离线计算节点显示的倒计时
 - [ ] 系统模板加入是否为Windows类系统的标记

+ 45 - 0
templates/failure.html

@@ -0,0 +1,45 @@
+{% extends "layout.html" %}
+{% block head %}
+    {{ super() }}
+<style type="text/css">
+    .alert,
+    .panel {
+        border-radius: 0;
+    }
+</style>
+{% endblock head %}
+{% block body %}
+<script type="text/javascript">
+     $(document).ready(function() {
+         setTimeout(function () {
+             window.location.href="{{ go_back_url }}";
+         }, "{{ timeout }}");
+     });
+</script>
+
+<div id="page-title">
+</div>
+
+<div class="row" style="margin-top: 100px;">
+    <div class="col-md-3"></div>
+    <div class="col-md-6">
+        <div class="panel">
+            <div class="panel-body">
+                <h3 class="title-hero" style="font-size: 24px;">{{ title }}</h3>
+                <div class="example-box-wrapper">
+                    <div class="alert alert-danger" style="padding: 30px;">
+                        <div class="bg-danger alert-icon">
+                            <i class="glyph-icon icon-close"></i>
+                        </div>
+                        <div class="alert-content">
+                            <h4 class="alert-title" style="font-size: 16px;">{{ message_title }}</h4>
+                            <p>{{ message }} 也可以<a href="{{ go_back_url }}" title="点击这里">点击这里</a>进行直接跳转。</p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="col-md-3"></div>
+</div>
+{% endblock body %}

+ 4 - 47
templates/reset_password.html

@@ -40,68 +40,25 @@
             $('.add-transition').attr('class', 'add-transition');
             $('.add-transition').addClass(transAttr);
         });
-
-        $("#login_form").delegate('#login_submit', 'click', function() {
-            login();
-
-        });
-
-        $("body").keydown(function() {
-            if (event.keyCode == "13") {//keyCode=13是回车键
-                login();
-            }
-        });
     });
 
-    function login() {
-        $.ajax({
-            url : '/api/user/_sign_in',
-            type : 'POST',
-            contentType: "application/json; charset=utf-8",
-            dataType: "json",
-            data : JSON.stringify({login_name: $('#login_name').val(), password: $('#password').val()}),
-            error : function(data, textStatus, xhr) {
-                if (data.status === 401) {
-                    insert_warning_window($('#login_submit'), '<strong>登录失败: </strong>&nbsp;&nbsp;请查证账号、密码重新登录.');
-                } else {
-                    insert_warning_window($('#login_submit'), data.responseText);
-                }
-            },
-            success : function(data, textStatus, xhr) {
-                window.location.href="/";
-            }
-        });
-    }
 </script>
 <div class="center-vertical">
     <div class="center-content row wow">
-        <form id="login_form" class="col-md-4 col-sm-5 col-xs-11 col-lg-3 center-margin">
-            <h3 class="text-center pad25B font-primary" style="font-family: 'Baskerville'; opacity: 0.83; font-size: -webkit-xxx-large;">JimV<span style="font-family: 'serif';"> Admin</span></h3>
+        <form id="login_form" class="col-md-4 col-sm-5 col-xs-11 col-lg-3 center-margin" action="/reset_password/{{ token }}" method="post">
+            <h3 class="text-center pad25B font-primary" style="font-family: 'serif'; opacity: 0.83; font-size: -webkit-xxx-large;">设置新密码</h3>
             <div id="login-form" class="content-box bg-default">
                 <div class="content-box-wrapper pad20A">
-                    <div class="form-group">
-                        <div class="input-group">
-                            <span class="input-group-addon addon-inside bg-gray">
-                                <i class="glyph-icon icon-user"></i>
-                            </span>
-                            <input type="text" class="form-control" id="login_name" placeholder="用户名" value="admin" disabled>
-                        </div>
-                    </div>
                     <div class="form-group">
                         <div class="input-group">
                             <span class="input-group-addon addon-inside bg-gray">
                                 <i class="glyph-icon icon-lock"></i>
                             </span>
-                            <input type="password" class="form-control" id="password" placeholder="默认密码:jimv.pswd.com">
+                            <input type="password" class="form-control" id="password" name="password" placeholder="新密码">
                         </div>
                     </div>
                     <div class="form-group" style="margin-bottom: 10px;">
-                        <button id="login_submit" type="button" class="btn btn-block btn-primary">登录</button>
-                    </div>
-                    <div class="row">
-                        <div class="text-right col-md-12">
-                            <a href="#" class="switch-button" title="找回密码">忘记密码?&nbsp;&nbsp;&nbsp;&nbsp;</a>
-                        </div>
+                        <button id="login_submit" class="btn btn-block btn-primary">下一步</button>
                     </div>
                 </div>
             </div>

+ 31 - 2
views/misc.py

@@ -49,6 +49,35 @@ def recover_password():
         return render_template('recover_password.html')
 
 
-def reset_password():
-    return render_template('reset_password.html')
+def reset_password(token):
+    host_url = request.host_url.rstrip('/')
+
+    if request.method == 'POST':
+        password = request.form.get('password')
+
+        payload = {
+            "password": password
+        }
+        url = host_url + '/api/user/_reset_password/' + token
+
+        headers = {'content-type': 'application/json'}
+        r = requests.post(url, data=json.dumps(payload), headers=headers)
+        j_r = json.loads(r.content)
+
+        if j_r['state']['code'] == '200':
+            return render_template('success.html',
+                                   go_back_url='/login',
+                                   timeout=10000, title=u'提交成功',
+                                   message_title=u'重置密码成功',
+                                   message=u'页面将在10秒钟后自动跳转到登录页面!')
+
+        else:
+            return render_template('failure.html',
+                                   go_back_url='/login',
+                                   timeout=10000, title=u'提交失败',
+                                   message_title=u'重置密码失败',
+                                   message=j_r['state']['sub']['zh-cn'] + u',页面将在10秒钟后自动跳转到登录页面!')
+
+    else:
+        return render_template('reset_password.html', token=token)
 

+ 1 - 1
views_route_table.py

@@ -18,7 +18,7 @@ add_rule_views(config.blueprint, '/create', views_func='config.create', methods=
 add_rule_views(misc.blueprint, 'login', views_func='misc.login', methods=['GET'])
 add_rule_views(misc.blueprint, 'change_password', views_func='misc.change_password', methods=['GET'])
 add_rule_views(misc.blueprint, 'recover_password', views_func='misc.recover_password', methods=['GET', 'POST'])
-add_rule_views(misc.blueprint, 'reset_password', views_func='misc.reset_password', methods=['GET'])
+add_rule_views(misc.blueprint, 'reset_password/<token>', views_func='misc.reset_password', methods=['GET', 'POST'])
 
 add_rule_views(dashboard.blueprint, '', views_func='dashboard.show', methods=['GET'])