pull/105/head
Apex Liu 2017-11-14 18:37:57 +08:00
parent f333a51e07
commit 9a74a0bd28
9 changed files with 92 additions and 396 deletions

File diff suppressed because one or more lines are too long

View File

@ -51,7 +51,7 @@ $app.on_init = function (cb_stack) {
$app.dom.input_username.val($app.options.username);
}
$app.dom.captcha_image.attr('src', '/auth/captcha?' + Math.random());
$app.dom.captcha_image.attr('src', '/auth/captcha?h=36&rnd=' + Math.random());
window.onresize = $app.on_screen_resize;
$app.init_blur_bg();
@ -76,7 +76,7 @@ $app.on_init = function (cb_stack) {
$app.dom.btn_login.click($app.login_account);
$app.dom.captcha_image.click(function () {
$(this).attr('src', '/auth/captcha?' + Math.random());
$(this).attr('src', '/auth/captcha?h=36&rnd=' + Math.random());
$app.dom.input_captcha.focus().val('');
});
$app.dom.input_username.keydown(function (event) {
@ -175,7 +175,7 @@ $app.login_account = function () {
else {
$app.hide_op_box();
$app.show_op_box('error', tp_error_msg(ret.code, ret.message));
$app.dom.captcha_image.attr('src', '/auth/captcha?' + Math.random());
$app.dom.captcha_image.attr('src', '/auth/captcha?h=36&rnd=' + Math.random());
$app.dom.input_captcha.focus().select().val('');
}

View File

@ -375,329 +375,5 @@
}
}
//.table-detail {
// width: 100%;
//
// td {
// padding: 5px;
// white-space: nowrap;
// //width: 100px;
//
// &.cell-info-name {
// width: 180px;
// border-right: 1px solid #e7e7e7;
// div {
// width: 180px;
// overflow: hidden;
// text-overflow: ellipsis;
//
// }
// .label {
// padding: 3px 5px;
// }
// }
// }
//
// td.host-offline {
// background-color: #ffcecc;
// text-align: center;
// vertical-align: middle;
//
// .host-offline-msg {
// color: #802506;
// font-size: 24px;
// }
// }
//
// tr.status-danger {
// background-color: @color-bg-danger;
// color: #fff;
//
// td.cell-info-name {
// border-right: 1px solid #f37272;
//
// & > a {
// //color: lighten(@color-bg-danger, 20%);
// color: #ddd;
// &:hover {
// color: #fff;
// }
// }
// }
//
// }
//}
//
//.table > thead > tr > th {
// padding: 5px 5px;
// outline: none;
// white-space: nowrap;
// font-weight: normal;
// text-align: center;
// background-color: #ededed;
//}
//
//.table > tbody > tr > td {
// padding: 5px;
// text-align: center;
// vertical-align: middle;
//}
//
//.table > tbody > tr > td .nowrap {
// white-space: nowrap;
//}
//
//.table.table-data thead .sorting, .table.table-data thead .sorting_asc, .table.table-data thead .sorting_desc {
// cursor: pointer;
// position: relative;
//}
//
//.table.table-data thead .sorting > span:after, .table.table-data thead .sorting_asc > span:after, .table.table-data thead .sorting_desc > span:after {
// bottom: 4px;
// padding-left: 5px;
// display: inline-block;
// font-family: 'FontAwesome';
// opacity: .8;
//}
//
//.table.table-data thead .sorting > span:after {
// opacity: .2;
// content: "\f0dc";
//}
//
//.table.table-data thead .sorting_asc > span:after {
// content: "\f0de";
//}
//
//.table.table-data thead .sorting_desc > span:after {
// content: "\f0dd";
//}
//.status {
// .status-name {
// float: left;
// padding: 3px 8px;
// background-color: #646464;
// border-top-left-radius: 4px;
// border-bottom-left-radius: 4px;
// //box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2);
// color: #e8e8e8;
// border-right: 1px solid #4c4c4c;
// //border:1px solid #999;
// text-shadow: 1px 1px 0 rgba(0, 0, 0, .6);
//
// }
//
// .status-bar-container {
// //padding-left:5px;
// height: 24px;
// //margin-bottom: 20px;
// overflow: hidden;
// background-color: #c1c1c1;
// border-top-right-radius: 4px;
// border-bottom-right-radius: 4px;
// box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
//
// .status-value, .status-percent {
// height: 100%;
// line-height: 24px;
// white-space: nowrap;
// }
//
// .status-value {
// padding-left: 10px;
// color: #2d2d2d;
// text-shadow: 1px 1px 0 rgba(255, 255, 255, .3);
// }
//
// .status-bar {
// text-align: center;
// box-shadow: inset 0 1px 2px rgba(0, 0, 0, .15);
//
// .status-percent {
// padding: 2px;
// color: #fff;
// }
// }
// }
//
// &.status-info {
// .status-bar-container {
// background-color: lighten(@color-bg-info, 20%);
// }
// .status-bar {
// background-color: @color-bg-info;
// }
//
// .status-value {
// background-color: @color-bg-info;
// color: #ffffff;
// text-shadow: 1px 1px 0 @color-bg-info;
// }
// }
//
// &.status-primary {
// //background-color: @color-bg-primary;
// }
//
// &.status-success {
// .status-bar-container {
// background-color: lighten(@color-bg-success, 20%);
// }
// .status-bar {
// background-color: @color-bg-success;
// }
//
// .status-value {
// background-color: @color-bg-success;
// color: #ffffff;
// text-shadow: 1px 1px 0 @color-bg-success;
// }
// }
//
// &.status-warning {
// .status-bar-container {
// background-color: lighten(@color-bg-warning, 20%);
// }
// .status-bar {
// background-color: @color-bg-warning;
// }
// .status-value {
// background-color: @color-bg-warning;
// color: #ffffff;
// text-shadow: 1px 1px 0 @color-bg-warning;
// }
// }
//
// &.status-danger {
// .status-bar-container {
// background-color: lighten(@color-bg-danger, 10%);
// }
// .status-bar {
// background-color: @color-bg-danger;
// }
// .status-value {
// background-color: @color-bg-danger;
// color: #ffffff;
// text-shadow: 1px 1px 0 @color-bg-danger;
// }
// }
//}
//==============================================
// 监控点的显示
//==============================================
.mp {
display: inline-block;
width: 20%;
max-width: 20%;
.mp-inner {
background-color: @color-bg-ignore;
//border: 1px solid #555;
margin: 3px;
border-radius: 4px;
//min-height:32px;
}
.mp-name {
color: @color-text-ignore;
padding: 9px;
margin-bottom: 3px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
//height:32px;
//line-height: 32px;
&.with-target {
//padding-top:10px;
padding-top: 17px;
padding-bottom: 1px;
}
}
.mp-target {
display: inline-block;
float: left;
position: absolute;
font-size: 11px;
padding: 0 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-top-left-radius: 4px;
border-bottom-right-radius: 4px;
color: rgba(255, 255, 255, 0.85);
background-color: rgba(0, 0, 0, 0.1);
}
&.mp-disabled {
.mp-inner {
background-color: @color-bg-ignore;
}
.mp-name {
color: @color-text-ignore;
}
}
&.mp-success {
.mp-inner {
background-color: @color-bg-success;
}
.mp-name {
color: @color-text-on-dark-bg;
}
}
&.mp-danger {
.mp-inner {
background-color: @color-bg-danger;
}
.mp-name {
color: @color-text-on-dark-bg;
}
}
&.mp-warning {
.mp-inner {
background-color: @color-bg-warning;
}
.mp-name {
color: @color-text-on-dark-bg;
}
}
}
.host-offline {
background-color: #ffcecc;
height: 36px;
line-height: 36px;
padding:0 10px;
color: #802506;
font-size: 20px;
cursor: pointer;
.tips {
display: none;
font-size: 12px;
}
&:hover {
.tips {
display: inline-block;
}
}
}
.host-no-strategy {
color: @color-text-ignore;
font-size: 16px;
}
@import "_overwrite_gritter";

View File

@ -2,7 +2,8 @@
import app.app_ver as app_ver
page_title_ = '安装配置TELEPORT服务'
%>
<%inherit file="../page_maintenance_base.mako"/>
## <%inherit file="../page_maintenance_base.mako"/>
<%inherit file="../page_single_base.mako"/>
## <%block name="breadcrumb">
## <ol class="breadcrumb">
@ -10,11 +11,11 @@
## </ol>
## </%block>
<%block name="page_header">
<h1><i class="fa fa-cog fa-fw"></i> ${self.attr.page_title_}</h1>
<%block name="extend_css_file">
## <link href="${ static_url('css/maintenance.css') }" rel="stylesheet" type="text/css"/>
</%block>
<%block name="extend_js">
<%block name="extend_js_file">
<script type="text/javascript" src="${ static_url('js/maintenance/install.js') }"></script>
</%block>
@ -24,6 +25,16 @@
</script>
</%block>
<%block name="page_header">
<div id="page-header" class="header header-fixed-top">
<nav class="navbar navbar-fixed-top">
<div class="container">
<h1><i class="fa fa-cog fa-fw"></i> ${self.attr.page_title_}</h1>
</div>
</nav>
</div>
</%block>
## Begin Main Body.
<div class="content-box">

View File

@ -58,24 +58,11 @@
<script type="text/javascript" src="${ static_url('plugins/json2/json2.js') }"></script>
<![endif]-->
## <script type="text/javascript" src="${ static_url('js/tpapp_const.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/tpapp_common.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/tpapp.js') }"></script>
<script type="text/javascript" src="${ static_url('js/tp-utils.js') }"></script>
<script type="text/javascript" src="${ static_url('js/tp-const.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/tp-assist.js') }"></script>
<script type="text/javascript" src="${ static_url('js/teleport.js') }"></script>
<%block name="extend_js"/>
<script type="text/javascript">
## $(document).ready(function () {
## tpapp.init();
## });
</script>
<%block name="embed_js" />
</body>

View File

@ -19,7 +19,9 @@
<link href="${ static_url('plugins/bootstrap/css/bootstrap.min.css') }" rel="stylesheet" type="text/css"/>
<link href="${ static_url('plugins/font-awesome/css/font-awesome.min.css') }" rel="stylesheet">
<link href="${ static_url('css/error.css') }" rel="stylesheet" type="text/css"/>
## <link href="${ static_url('css/error.css') }" rel="stylesheet" type="text/css"/>
<link href="${ static_url('css/single.css') }" rel="stylesheet" type="text/css"/>
<%block name="extend_css_file"/>
<%block name="embed_css"/>
@ -27,21 +29,36 @@
<body>
<div id="page-header">
<div>
<%block name="page_header"/>
<div id="page-content">
<div class="container">
<div class="title"><%block name="header_title"/></div>
${self.body()}
</div>
</div>
<div id="page-content">
<div class="container">
${self.body()}
</div>
</div>
<%include file="_footer.mako"/>
</div>
## <div id="page-header">
## <nav class="navbar navbar-fixed-top">
## <div class="container">
## <%block name="page_header"/>
## </div>
## </nav>
## </div>
## <div id="page-content">
## <div class="container">
##
## ${self.body()}
##
## </div>
## </div>
## <%include file="_footer.mako"/>
<%block name="extend_content" />
@ -59,11 +76,8 @@
<script type="text/javascript" src="${ static_url('js/tp-const.js') }"></script>
<script type="text/javascript" src="${ static_url('js/teleport.js') }"></script>
<%block name="extend_js_file"/>
<%block name="embed_js" />
</body>
</html>

View File

@ -1,9 +1,9 @@
<%!
page_title_ = '设置密码'
page_title_ = '密码管理'
%>
<%inherit file="../page_single_base.mako"/>
<%block name="header_title">
<%block name="page_header">
<a href="http://teleport.eomsoft.net" target="_blank"><span class="logo"></span></a>
</%block>
@ -24,7 +24,7 @@
<div class="page-content">
<div class="error-box">
<div class="error-icon-box">
<i class="fa fa-warning"></i>
<i id="icon-bg" class="fa fa-warning"></i>
</div>
<div class="error-message-box">
<div id="title" class="title">设置密码</div>
@ -73,7 +73,7 @@
<div class="row" style="padding:0 20px;margin-top:10px;">
<div class="col-sm-4">
<button type="button" class="btn btn-primary" id="btn-send-email" style="width:100%;"><i class="fa fa-check fa-fw"></i> 重置密码</button>
<button type="button" class="btn btn-primary" id="btn-send-email" style="width:100%;"><i class="fa fa-search-plus fa-fw"></i> 找回密码</button>
</div>
<div class="col-sm-8">
<div id="send-result" class="alert alert-danger" style="display: none;"></div>
@ -109,18 +109,18 @@
## <div class="form-group form-group-sm">
## <div class="col-sm-4">
## <div class="input-group">
## <input data-field="password" type="password" class="form-control mono" placeholder="设置新密码">
## <span class="input-group-btn"><button class="btn btn-sm btn-default" type="button" id="btn-switch-password"><i class="fa fa-eye fa-fw"></i></button></span>
## </div>
## </div>
## <div class="col-sm-8">
## <button type="button" class="btn btn-sm btn-primary" id="btn-reset-password"><i class="fa fa-check fa-fw"></i> 重置密码</button>
## </div>
## </div>
## <div class="clear-float"></div>
## <div class="form-group form-group-sm">
## <div class="col-sm-4">
## <div class="input-group">
## <input data-field="password" type="password" class="form-control mono" placeholder="设置新密码">
## <span class="input-group-btn"><button class="btn btn-sm btn-default" type="button" id="btn-switch-password"><i class="fa fa-eye fa-fw"></i></button></span>
## </div>
## </div>
## <div class="col-sm-8">
## <button type="button" class="btn btn-sm btn-primary" id="btn-reset-password"><i class="fa fa-check fa-fw"></i> 重置密码</button>
## </div>
## </div>
## <div class="clear-float"></div>
</div>
</div>
</div>
@ -135,6 +135,7 @@
$app.dom = {
title: $('#title'),
icon_bg: $('#icon-bg'),
err_area: $('#error-area'),
message: $('#message'),
@ -146,10 +147,15 @@
password_area: $('#password-area')
};
$app.dom.captcha_image.click(function () {
$(this).attr('src', '/auth/captcha?h=28&rnd=' + Math.random());
$app.dom.input_captcha.focus().val('');
});
if ($app.options.mode === 1) {
// show 'find-my-password' page
$app.dom.title.text('找回密码');
$app.dom.icon_bg.removeClass().addClass('fa fa-search-plus');
$app.dom.captcha_image.attr('src', '/auth/captcha?h=28&rnd=' + Math.random());
$app.dom.find_password_area.show();
} else if ($app.options.mode === 2) {

View File

@ -78,21 +78,24 @@ class MeHandler(TPBaseHandler):
class ResetPasswordHandler(TPBaseHandler):
def get(self):
param = {
'mode': 0, # mode=1, unknown mode.
'mode': 0, # mode=0, unknown mode.
'token': '',
'code': TPE_PARAM
'code': TPE_OK
}
_mode = self.get_argument('mode', 1)
_token = self.get_argument('token', None)
if _token is None:
param['mode'] = 1 # mode=1, show 'find-my-password' page.
else:
err, email = user.check_reset_token(_token)
param['mode'] = 3 # mode=3, show 'set-new-password' page
param['token'] = _token
param['email'] = email
err = user.check_reset_token(_token)
param['code'] = err
param['token'] = _token
if err != TPE_OK:
param['mode'] = 2 # mode=2, show 'error' page
else:
param['mode'] = 3 # mode=3, show 'set-new-password' page
self.render('user/reset-password.mako', page_param=json.dumps(param))
@ -469,7 +472,6 @@ class DoResetPasswordHandler(TPBaseJsonHandler):
try:
user_id = int(args['id'])
mode = int(args['mode'])
# email = args['email'].strip()
password = args['password']
except:
return self.write_json(TPE_PARAM)

View File

@ -292,29 +292,29 @@ def generate_reset_password_token(handler, user_id):
def check_reset_token(token):
db = get_db()
s = SQL(db)
# s = SQL(db)
_time_now = tp_timestamp_utc_now()
# 0. query user's id
sql = 'SELECT user_id, create_time FROM `{dbtp}user_rpt` WHERE token={dbph};'.format(dbtp=db.table_prefix, dbph=db.place_holder)
sql = 'SELECT create_time FROM `{dbtp}user_rpt` WHERE token={dbph};'.format(dbtp=db.table_prefix, dbph=db.place_holder)
db_ret = db.query(sql, (token,))
if db_ret is None or len(db_ret) == 0:
return TPE_NOT_EXISTS, ''
return TPE_NOT_EXISTS
user_id = db_ret[0][0]
create_time = db_ret[0][1]
# user_id = db_ret[0][0]
create_time = db_ret[0][0]
err = s.select_from('user', ['email'], alt_name='u').where('u.id="{user_id}"'.format(user_id=user_id)).query()
if err != TPE_OK:
return err, ''
if len(s.recorder) == 0:
return TPE_DATABASE, ''
email = s.recorder[0].email
# err = s.select_from('user', ['email'], alt_name='u').where('u.id="{user_id}"'.format(user_id=user_id)).query()
# if err != TPE_OK:
# return err
# if len(s.recorder) == 0:
# return TPE_DATABASE
# email = s.recorder[0].email
if _time_now - create_time > 24 * 60 * 60:
return TPE_EXPIRED, email
return TPE_EXPIRED
else:
return TPE_OK, email
return TPE_OK
def update_login_info(handler, user_id):