day62-flask项目爱家头像上传及认证

2019-02-12  本文已影响0人  barriers

在flask中用函数名实现跳转的只有反向解析。其他都是由蓝图别名加路由实现跳转。而反向解析为蓝图的第一个参数加重定向的函数名实现跳转。形式为url_for('生成蓝图的第一个参数.重定向的函数名')。
在js中实现页面跳转有两种方式,location.href = '/user/my/'和(location).attr('href', '/user/my/') 在ajax中给图片等传输文件地址时,使用('#user-avatar').attr('src', data.data.avatar)

1登陆校验装饰器

def need_check(func):
    @wraps(func)
    def check_path(*args, **kwargs):
        if 'user_id' in session:
            # 判断session中是否存在登陆的标识user_id
            return func(*args, **kwargs)
        else:
            return redirect(url_for('user.my_login'))
    return check_path

登陆成功时向session中存值

3.密码校验
if user.check_pwd(passwd):
    session['user_id'] = user.id
    return jsonify({'code': 200, 'msg': '请求成功'})

2解析当前登陆用户

前后分离过程中在页面解析当前登陆用户的相关信息(不使用current_user),通过使用自定义的对象方法to_basic_dict()将对象序列化传递给前端,然后前端获取到相关标签并对其进行解析。

@user_blue.route('/user_info/', methods=['GET'])
def user_info():
    user_id = session['user_id']
    user = User.query.get(user_id)
    return jsonify({'code': 200, 'msg': '请求成功', 'data': user.to_basic_dict()})

$(document).ready(function(){
    $.ajax({
        url:'/user/user_info/',
        dataType:'json',
        type:'GET',
        success:function (data) {
            $('#user-name').html(data.data.name)
            $('#user-mobile').html(data.data.phone)
            $('#user-avatar').attr('src', '/static/media/'+data.data.avatar)
        }
    })
})

3修改头像

$(document).ready(function () {
    $('#form-avatar').submit(function (e) {
        e.preventDefault();
        $(this).ajaxSubmit({
            url:'/user/profile/',
            type:'PATCH',
            dataType:'json',
            success:function (data) {
                if(data.code == 200){
                    $('#user-avatar').attr('src', '/static/media/'+data.avatar)
                }
                if(data.code == 1009){
                    $('#avatar-err span').html(data.msg)
                    $('#avatar-err').show()
                }
            }
        })
    })

@user_blue.route('/profile/', methods=['PATCH'])
@need_check
def patch_profile():
    # 1.获取图片
    ima = request.files.get('avatar')
    if not ima:
        return jsonify({'code': 1009, 'msg': '上传图片不能为空'})
    else:
        # 2.获取项目路径
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        # 3.获取媒体文件的路径
        STATIC_DIR = os.path.join(BASE_DIR, 'static')
        MEDIA_DIR = os.path.join(STATIC_DIR, 'media')
        # 4.生成随机图片名称
        filename = str(uuid.uuid4())
        # 5.获取图片的后缀
        a = ima.mimetype.split('/')[-1]
        # 6.生成文件名
        name = filename + '.' + a
        # 7.拼接图片地址
        path = os.path.join(MEDIA_DIR, name)
        # 8.将图片保存到media文件夹中
        ima.save(path)
        # 9.获取用户对象
        user_id = session['user_id']
        user = User.query.filter_by(id=user_id).first()
        # 10.给用户头像赋值并保存
        user.avatar = name
        user.add_update()
        return jsonify({'code': 200, 'msg': '请求成功', 'avatar': user.avatar})

4修改姓名

$('#form-name').submit(function (e) {
    e.preventDefault();
    $(this).ajaxSubmit({
        url:'/user/my_profile/',
        type:'POST',
        dataType:'json',
        success:function (data) {
            if(data.code == 200){
                location.href = '/user/my/'
            }
            if(data.code == 1010){
                $('#name-err span').html(data.msg)
                $('#name-err').show()
            }
            if(data.code == 1011){
                $('#name-err span').html(data.msg)
                $('#name-err').show()
            }
        }
    })
})

@user_blue.route('/my_profile/', methods=['POST'])
@need_check
def my_profile():
    # 1.获取用户名
    name = request.form.get('name')
    if not name:
        return jsonify({'code': 1010, 'msg': '姓名不能为空'})
    else:
        user = User.query.filter(User.name == name).first()
        if user:
            return jsonify({'code': 1011, 'msg': '已存在该用户名,请重新输入'})
        else:
            user_id = session['user_id']
            user = User.query.get(user_id)
            user.name = name
            user.add_update()
            return jsonify({'code': 200, 'msg': '修改成功'})

5实名认证

$(document).ready(function () {
    $('#form-auth').submit(function (e) {
        e.preventDefault();
        $(this).ajaxSubmit({
            url:'/user/auth/',
            dataType:'json',
            type:'POST',
            success:function (data) {
                if(data.code == 200){
                   location.href = '/user/my/'
               }
               if(data.code == 2000){
                   $('.error-msg span').html(data.msg)
                   $('.error-msg').show()
               }
               if(data.code == 2001){
                   $('.error-msg span').html(data.msg)
                   $('.error-msg').show()
               }
               if(data.code == 2002){
                   $('.error-msg span').html(data.msg)
                   $('.error-msg').show()
               }
               if(data.code == 2003){
                   $('.error-msg span').html(data.msg)
                   $('.error-msg').show()
               }
            }
        })
    })
})

@user_blue.route('/auth/', methods=['POST'])
@need_check
def my_auth():
    # 1.获取用户名和身份证号
    real_name = request.form.get('real_name')
    id_card = request.form.get('id_card')
    # 2.判断用户名及身份证是否填写完全
    if not (2 <= len(real_name) <= 4 or len(id_card) == 18):
        return jsonify({'code': 2000, 'msg': '请填写合法的用户名(2至4个字符)或身份证号(18个字符)'})
    else:
        if re.search(r'[^\u4e00-\u9fa5]', real_name):
            return jsonify({'code': 2001, 'msg': '姓名中包含不合法的字符(请全部使用汉字)'})
        if not re.fullmatch(r'^\d{17}[xX\d]$', id_card):
            return jsonify({'code': 2002, 'msg': '身份证号不合法'})
        # 3.查询该身份证号是否已被用于实名认证过
        user = User.query.filter_by(id_card=id_card).first()
        if user:
            return jsonify({'code': 2003, 'msg': '该身份证号已被实名认证'})
        # 4.保存实名认证信息
        user_id = session['user_id']
        user = User.query.get(user_id)
        user.id_name = real_name
        user.id_card = id_card
        user.add_update()
        return jsonify({'code': 200, 'msg': '实名认证成功'})

6退出

@user_blue.route('/logout/', methods=['GET'])
def logout():
    del session['user_id']
    return jsonify({'code': 200, 'msg': '请求成功', 'errno': 0})

function logout() {
    $.get("/user/logout", function(data){
        if (0 == data.errno) {
            location.href = "/user/my_login/";
        }
    })
}
上一篇下一篇

猜你喜欢

热点阅读