cms后台修改密码界面布局

先创建cms_resetpwd.html页面,继承cms_base.html

{% extends 'cms/cms_base.html' %}

{% block title %}
修改密码-CMS管理系统
{% endblock %} {% block page_title %}
个人中心>>>修改密码
{% endblock %} {% block main_content %}
暂无
{% endblock %}

然后编辑cms.views.py,编写修改密码的时候,因为修改密码会用到get和post方法,为了方便,我们就用类视图

...

class ResetPwdView(views.MethodView):
decorators = [login_required] #修改密码也要先登录,这是类视图使用装饰器
def get(self):
return render_template('cms/cms_resetpwd.html') def post(self):
pass bp.add_url_rule('/resetpwd/', view_func=ResetPwdView.as_view('resetpwd'))

编辑cms_base.html修改 "修改密码" 的url

<li><a href="{{ url_for('cms.resetpwd') }}">修改密码</a></li>

我们想要的效果图如下:

这就可以借助bootstrap 了

我们打开 bootstrap中文站(v3 版本),找到表单

可以发现,红色框住的部分和我们效果图的表单是一样的

然后效果图中的表单之前是右空隙的,我们也可以像以下代码一样通过每组表单使用<div class='form-group'>包起来即可

然后,就是按钮了

这样把以上代码组合起来,就是如下:

{% extends 'cms/cms_base.html' %}

{% block title %}
修改密码-CMS管理系统
{% endblock %} {% block page_title %}
个人中心>>>修改密码
{% endblock %} {% block main_content %}
<form>
<!--旧密码-->
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">旧密码</div>
<input type="password" class="form-control" placeholder="旧密码" name="oldpwd">
</div>
</div> <!--新密码-->
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">新密码</div>
<input type="password" class="form-control" placeholder="旧密码" name="newpwd">
</div>
</div> <!--确认新密码-->
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">确认密码</div>
<input type="password" class="form-control" placeholder="旧密码" name="newpwd2">
</div> </div> <!--按钮-->
<div class="form-group">
<button type="button" class="btn btn-primary" id="submit">立即保存</button>
</div> </form>
{% endblock %}

cms_resetpwd.html

可以给一个div把他们包起来,然后给这个div设置的宽度,最终布局代码如下

{% extends 'cms/cms_base.html' %}

{% block title %}修改密码-CMS管理系统{% endblock %}

{% block page_title %}个人中心>>>修改密码{% endblock %}

{% block head %}
<style>
.form-container{
width: 300px;
}
</style>
{% endblock %} {% block main_content %}
<form>
<div class="form-container">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">原密码</div>
<input type="password" class="form-control" placeholder="原密码" name="oldpwd">
</div> </div> <div class="form-group">
<div class="input-group">
<div class="input-group-addon">新密码</div>
<input type="password" class="form-control" placeholder="新密码" name="newpwd">
</div> </div> <div class="form-group">
<div class="input-group">
<div class="input-group-addon">确认新密码</div>
<input type="password" class="form-control" placeholder="确认新密码" name="newpwd2">
</div> </div> <div class="form-group">
<button type="button" class="btn btn-primary" id="submit">立即保存</button>
</div>
</div>
</form>
{% endblock %}

cms_resetpwd.html

cms后台修改密码ajax功能

当我们输入完密码点击"立即保存",这个表单提交是通过ajax来实现的,因为提交后并不需要跳转到其他页面,这是一个异步的请求。

因为项目中开启了CSRF保护,所以AJAX也要启用csfs,这里为了方便,我们自己封装了一个ajax方法,这个方法其他的地方也可以用,所以把它放在static/common/js/bbsajax.js中(这个js主要是来封装csrf)

'use strict';

var bbsajax = {
'get': function (args) {
args['method'] = 'get';
this.ajax(args);
},
'post':function (args) {
args['method'] = 'post';
this.ajax(args);
},
'ajax':function (args) {
//设置csrftoken
this._ajaxSetup();
$.ajax(args);
},
'_ajaxSetup': function () {
$.ajaxSetup({
'beforeSend': function (xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain){
var csrf_token = $('meta[name=csrf-token]').attr('content');
xhr.setRequestHeader("X-CSRFToken", csrf_token)
}
}
});
}
};

bbsajax.js

把csrf放置cms_base.html的head中,这样其他子模板也会继承了, 把bbsajax.js也引入进来,以便子模板继承

<meta name="csrf-token" content="{{ csrf_token() }}">
..
<script src="{{ url_for('static', filename='common/js/bbsajax.js') }}"></script>

在static/cms/js/新建一个resetpwd.js

/**
* Created by user on 2018/8/7.
*/ $(function () {
$('#submit').click(function (event) {
//阻止按钮默认的提交表单行为
event.preventDefault();
var oldpwdE = $('input[name=oldpwd]');
var newpwdE = $('input[name=newpwd]');
var newpwd2E = $('input[name=newpwd2]'); var oldpwd = oldpwdE.val();
var newpwd = newpwdE.val();
var newpwd2 = newpwd2E.val(); //这里使用我们自己封装好的bbsajax,它具有了csrf
bbsajax.post({
'url': '/cms/resetpwd/',
'data': {
'oldpwd': oldpwd,
'newpwd': newpwd,
'newpwd2': newpwd2
},
'success': function (data) {
console.log(data);
},
'fail': function (error) {
console.log(error);
}
});
});
})

在cms_resetpwd.html中,把resetpwd.js文件引入进来

{% block head %}
...
<script src="{{ url_for('static', filename='cms/js/resetpwd.js') }}"></script>
{% endblock %}

cms后台修改密码功能

现在可以写后端修改密码的逻辑了,用户提交表单上来,我们就要先对表单进行验证,因此先编辑cms.forms.py写一个RestPwdForm

...
from wtforms.validators import Length, EqualTo class ResetPwdForm(BaseForm):
oldpwd = StringField(validators=[Length(6,30, message='密码长度6-30')])
newpwd = StringField(validators=[Length(6,30, message='密码长度6-30')])
newpwd2 = StringField(validators=[EqualTo('newpwd', message='新密码输入不一致')])

编辑cms.views,py编写功能逻辑

from flask import jsonify
from exts import db
... class ResetPwdView(views.MethodView):
decorators = [login_required]
def get(self):
return render_template('cms/cms_resetpwd.html') def post(self):
resetpwd_form = ResetPwdForm(request.form)
if resetpwd_form.validate():
oldpwd = resetpwd_form.oldpwd.data
newpwd = resetpwd_form.newpwd.data
user = g.cms_user
if user.check_password(oldpwd):
user.password = newpwd
db.session.commit()
#因为接受的是ajax,所以这里使用jsonify返回数据
#返回code字段表示状态码,message信息提示
return jsonify({"code": 200, "message":"修改成功"})
else:
return jsonify({"code": 400, "message": "原密码错误"})
else:
message = resetpwd_form.get_error()
return jsonify({"code": 400, "message":message})

31、Flask实战第31天:cms后台修改密码的更多相关文章

  1. 36、Flask实战第36天:客户端权限验证

    编辑cms_base.html <li><a href="#">{{ g.cms_user.username }}<span>[超级管理员]&l ...

  2. DedeCms织梦后台管理员密码修改和忘记重置方法

    方法/步骤 打开dede_admin数据表: 进入你的MYSQL后台,然后在你的数据库名中,找到dede_admin这项如图,pwd下的值就是你的密码,织梦密码采取的是MD5加密,破解麻烦而且没有必要 ...

  3. 27、Flask实战第27天:cms后台登录

    cms后台登录界面 后台登录页面,我们不用自己写,只需要去Bootstrap中文网去找一个模板改一下就行 这里使用的模板是:https://v3.bootcss.com/examples/signin ...

  4. 28、Flask实战第28天:cms后台模板渲染

    这节开始,我们需要用到前端模板.^_^..如果需要模板素材的同学,可以点击博客的右侧二维码进行打赏(10元),截图发送到邮箱463951510@qq.com,写明索取flask论坛素材即可,博主收到邮 ...

  5. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  6. 29、Flask实战第29天:cms用户名渲染和注销功能实现

    这节来完成用户名渲染和注销的功能,目前用户名在前端页面是写死的,我们需要动态的展示出来 用户名渲染 实现用户名动态展示,其中一种方法就是在视图函数,根据session信息,获取到user id,通过该 ...

  7. 34、Flask实战第34天:修改邮箱

    修改邮箱页面布局 新建cms/cms_resetemail.html {% extends 'cms/cms_base.html' %} {% block title %}修改邮箱-CMS管理系统{% ...

  8. 33、Flask实战第33天:sweetalert提示框

    这节我们继续优化,接收到返回值,我们在前端做一些处理,如:密码修改成功,弹出一个成功的提示框.这个提示框我们采用sweetalert 其中xtalert.js是对上面两个文件的一个封装,使得我们用sw ...

  9. 25、Flask实战第25天:项目结构搭建

    创建一个虚拟环境bbs,并安装flask框架 #cmd进入DOS窗口 mkvirtualenv bbs pip install flask 在本地磁盘D新建项目目录:bbs 打开pycharm,创建f ...

随机推荐

  1. java 7修改文件权限

    Full control over file attributes is available in Java 7, as part of the "new" New IO faci ...

  2. Jmeter-7-在命令行中运行Jmeter.

    jmeter -n -t D:\Jmeter_result\Script_baidu.jmx -l D:\Jmeter_result\Script_baidu.txt jmeter -n -t D:\ ...

  3. Bzoj4873 [SXOI2017]寿司餐厅

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 64  Solved: 45 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每 ...

  4. 【Luogu】P3927 SAC E#1 - 一道中档题 Factorial

    [题目]洛谷10月月赛R1 提高组 [题意]求n!在k进制下末尾0的个数,n<=1e18,k<=1e16. [题解]考虑10进制末尾0要考虑2和5,推广到k进制则将k分解质因数. 每个质因 ...

  5. javascript 事件绑定

    一.最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性.事件属性名称由事件类型外加一个“on”前缀构成.这些属性也被称为事件处理器 <INPUT TYPE="text&q ...

  6. js_一个简单的30分钟循环倒计时

    吐槽段: 需求的变更是千变万化的,至少在你说服和你打交道的那位谁谁谁之前. 创业公司就是这样,产品经理一个想法,就是改改改,管你改起来复杂不复杂,在他们眼里都是非常简单的. 今天的一个小改动需求,把活 ...

  7. Python 对象的深拷贝与浅拷贝 -- (转)

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  8. Angular2.0 基础: 环境搭建

    最近在学习Angular2的使用,其实看过Angular2 文档的都知道,相比于之前的Angular1,Angular2 的改动还是挺大的. 而对于‘angular2 的本地开发环境的搭建的中,我们首 ...

  9. 记一次Powershell反混淆 (1)

    样本地址: https://www.virustotal.com/#/file/6f9034646e6fcead5342f708031412e3c2efdb4fb0f37bba43133a471d1c ...

  10. Linux二进制代码的阅读

    大多数时候,我们研究的是如何阅读源代码.但在一些情况下,比如源代码不公开 或得到源代码的代价很高的情况下,我们又不得不需要了解程序的行为,这 时阅读二进制文件就非常重要.假设现在有一个二进制可执行文件 ...