Python Flask框架+jQuery Ajax实现CRUD

Flask框架作为当下最流行的web框架,其功能和特点博主在初识Flask框架博客中早已有过介绍,这里会用Flask框架来实现CRUD增删改查。
先来看看效果图:

登录页面:
Python Flask框架+jQuery Ajax实现CRUD_第1张图片注册用户页面
Python Flask框架+jQuery Ajax实现CRUD_第2张图片

主页面:
Python Flask框架+jQuery Ajax实现CRUD_第3张图片
用户管理页面和职业管理页面:
Python Flask框架+jQuery Ajax实现CRUD_第4张图片Python Flask框架+jQuery Ajax实现CRUD_第5张图片
可以在此页面进行用户和职位信息的增删改查。

以下是具体实现的代码:

config.py——配置文件,在app.py中引用

DEBUG = True
SECRET_KEY = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
PAGE_SIZE = 10

SERVER_ADDR = '10.0.14.204'
SERVER_PORT = 80

app.py 运行文件

from flask import Flask, render_template,request,session, url_for,Response
import config
from config_class import *
from datetime import timedelta
from controller.usercontroller import usercontroller
from filter.sessionfilter import  sessionfilter
from controller.jobcontroller import jobtaskcontroller
from controller.pycontroller import pytaskcontroller
from controller.shopcontroller import shoptaskcontroller
import hashlib

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'AAAGGGGCCFDDDFFFDDDD'
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)  #设置session的保存时间。

# 是使用config py文件定义配置
app.config.from_object(config)
# 是使用class定义配置
app.config.from_object(DebugConfig)

app.register_blueprint(usercontroller)   # 声明
app.register_blueprint(sessionfilter)   # 声明
app.register_blueprint(jobtaskcontroller)
app.register_blueprint(pytaskcontroller)
app.register_blueprint(shoptaskcontroller)

@app.route('/')  # URL路由
def index():
    print(session.get('user'))
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host=app.config['SERVER_ADDR'], port=app.config['SERVER_PORT'], debug=True)

usercontroller.py

from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify
import hashlib
from service.userservice import UserService
from entity.user import User
import json
from filter.sessionfilter import sessionFilter
import os

usercontroller = Blueprint('usercontroller', __name__)
userService = UserService()

@usercontroller.route("/login.do", methods=['POST', 'GET'])
def login():
    userName = request.form.get('userName')  # 表单提交的数据使用request.form[]
    userPwd = request.form.get('userPwd')
    result = userService.findUserByUserName(userName)
    print(result)
    if result and  result[0][2] == userPwd:
        userItem = {}
        userItem['userId'] = result[0][0]
        userItem['userName'] = result[0][1]
        session['user'] = userItem
        print(hashlib.md5('123456'.encode(encoding='utf-8')).hexdigest())
        # 登录成功,则保存Cookies信息
        resp = Response(render_template('main.html', messasge='登录成功'))
        resp.set_cookie('userName', userName, max_age=7*24*3600)
        resp.set_cookie('userPwd', userPwd, max_age=7*24*3600)
        return resp
        pass
    elif result and  result[2] != userPwd:
        return render_template('login.html', message='用户名或密码错误')
        pass
    return render_template('login.html')
    pass

@usercontroller.route('/logout.do', methods=['POST', 'GET'])
def logout():
    session.clear()
    print('==========', session.get('user'))
    resp = Response(render_template('login.html'))
    resp.delete_cookie('userName')
    resp.delete_cookie('userPwd')
    return resp
    pass

@usercontroller.route('/goregist.do')
def goRegist():
    return render_template('regist.html')
    pass

@usercontroller.route('/regist.do', methods=['POST', 'GET'])
def regist():
    userData = request.get_data()
    userDict = json.loads(userData)

    user = User()
    user.userId = userDict.get('userId')
    user.userName = userDict.get('userName')  # 表单提交的数据使用request.form[]
    user.userPwd =  userDict.get('userPwd')
    user.userSex =  userDict.get('userSex')
    user.userBirth =  userDict.get('userBirth')
    user.userPic =  userDict.get('userPic')
    user.userIntro =  userDict.get('userIntro')

    result = userService.createUser(user)

    if result > 0:
        return render_template('login.html', message='注册成功')
        pass
    else:
        return render_template('regist.html', message='注册失败')
        pass
    pass

# 查询用户,并且显示
@usercontroller.route('/gouserinfo.do', methods=['POST', 'GET'])
def goUserInfo():
    userName = request.form.get('userName')
    userSex = request.form.get('userSex')
    user = User()
    user.userName = userName
    user.userSex = userSex
    userList = userService.findUserList(user)
    return render_template('systeminfo/userinfo.html', userList = userList, user=user)
    pass

# 删除用户,并且显示
@usercontroller.route('/removeruser.do', methods=['POST', 'GET'])
def goRemoveUser():
    userId = request.args.get('userId')
    userName = request.form.get('userName')
    userSex = request.form.get('userSex')
    user = User()
    user.userName = userName
    user.userSex = userSex
    result = userService.removeUser(userId)
    userList = userService.findUserList(user)
    return render_template('systeminfo/userinfo.html', userList = userList, message='删除成功' if result >0 else '删除失败')
    pass

@usercontroller.route('/gomodifyuser.do', methods=['POST', 'GET'])
def goModifyUser():
    userId = request.args.get('userId')
    user = userService.findUserByUserId(userId)
    return render_template('systeminfo/modifyuser.html', user=user)
    pass

@usercontroller.route('/gomodifysubmit.do', methods=['POST', 'GET'])
def goSubmitModifyUser():
    userId = request.form.get('userId')
    userName = request.form.get('userName')
    userSex = request.form.get('userSex')
    user = User()
    user.userName = userName
    user.userSex = userSex
    user.userId = userId

    result = userService.updateUser(user)
    userList = userService.findUserList(user)
    return render_template('systeminfo/userinfo.html', userList=userList, message='修改成功' if result > 0 else '修改失败')
    pass

@usercontroller.route('/checkusername.do', methods=['POST', 'GET'])
def checkUserName():
    userData = request.get_data()
    userDict = json.loads(userData)

    user = userService.findUserByUserName(userDict.get('userName'))
    dicts = {}
    if user:
        dicts = {'code':1}
        pass
    else:
        dicts = {'code':0}
        pass
    return json.dumps(dicts)
    pass

@usercontroller.route('/goajaxuserinfo.do', methods=['POST', 'GET'])
@sessionFilter
def goAjaxUserInfo():
    return render_template("systeminfo/userinfo.html")
    pass

@usercontroller.route('/ajaxuserinfo.do', methods=['POST', 'GET'])
def getUserInfo():
    userData = request.get_data()
    userDict = json.loads(userData)
    tData = {}

    user = User()
    user.userName = userDict.get('userName')
    user.userSex = userDict.get('userSex')

    currentPage = int(userDict.get('currentPage'))
    pageSize = int(userDict.get('pageSize'))
    opr = userDict.get('opr')
    userId = int(userDict.get('userId'))
    user.userId = userId

    delResult = 0
    if opr == 'del':
        delResult = userService.removeUser(userId)
        pass
    elif opr == 'update':
        tUser = userService.findUserByUserId(userId)
        tData['userId'] = tUser.userId
        tData['userName'] = tUser.userName
        tData['userSex'] = tUser.userSex
        returnData = {'code': 1, 'userData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}

        return json.dumps(returnData)
    elif opr == 'submitUpdate':
        userService.updateUser(user)
        pass

    result = userService.findPageUserList(user, pageSize, currentPage)
    counts = userService.countUsers(user)
    totalPage = 0

    if(counts%pageSize == 0):
        totalPage = counts//pageSize
    else:
        totalPage = counts // pageSize + 1
        pass

    returnData = {'code':1, 'userData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'delcode':delResult, 'opr':'search','counts':counts}

    return json.dumps(returnData)
    pass

@usercontroller.route('/upload.do', methods=['POST', 'GET'], strict_slashes=False)
def uploadFile():
    # 后缀需要检查的
    file = request.files.get('upload')
    file.save(os.path.dirname(__file__) + os.sep + '..' + os.sep + 'static' + os.sep + 'uploads' + os.sep + file.filename)
    return json.dumps({'url': os.sep + 'static' + os.sep +  'uploads' + os.sep + file.filename})

userserver.py 前后端的连接

from dao.userdao import UserDao
from entity.user import User

class UserService:

    def findUserByUserName(self, userName):
        userDao = UserDao()
        return userDao.findUserByUserName(userName)
        pass

    def createUser(self, user):
        userDao = UserDao()
        return userDao.createUser(user)
        pass

    def findUserList(self, user):
        userDao = UserDao()
        userlist = []
        result = userDao.findUserList(user)
        for temp in result:
            tuser = User()
            tuser.userId = temp[0]
            tuser.userName = temp[1]
            tuser.userSex = temp[4]
            userlist.append(tuser)
            pass
        return userlist
        pass

    def removeUser(self, userId):
        userDao = UserDao()
        return userDao.removeUser(userId)
        pass

    def findUserByUserId(self, userId):
        userDao = UserDao()
        result = userDao.findUserByUserId(userId)
        user = None
        if result:
            user = User()
            user.userId = result[0][0]
            user.userName = result[0][1]
            user.userSex = result[0][2]
            pass
        return user
        pass

    # 修改用户信息
    def updateUser(self, user):
        userDao = UserDao()
        return userDao.updateUser(user)
        pass

    def findPageUserList(self, user, pageSize, currentPage):
        userDao = UserDao()
        return userDao.findPageUserList(user, pageSize, currentPage)
        pass

    def countUsers(self, user):
        userDao = UserDao()
        return userDao.countUsers(user)[0]
        pass
    pass

user.py 用户实体类封装

class User():
    def __init__(self):
        self.__userId = None
        self.__userName = None
        self.__userPwd = None
        self.__userSex = None
        self.__userPic = None
        self.__userBirth = None
        self.__userIntro = None
        self.__userDeptId = None
        self.__userDeptName = None
        self.__userRole = None
        pass

    @property
    def userId(self):
        return self.__userId
        pass

    @userId.setter
    def userId(self, userId):
        self.__userId = userId
        pass

    @property
    def userName(self):
        return self.__userName
        pass

    @userName.setter
    def userName(self, userName):
        self.__userName = userName
        pass

    @property
    def userPwd(self):
        return self.__userPwd
        pass

    @userPwd.setter
    def userPwd(self, userPwd):
        self.__userPwd = userPwd
        pass

    @property
    def userSex(self):
        return self.__userSex
        pass

    @userSex.setter
    def userSex(self, userSex):
        self.__userSex = userSex
        pass

    @property
    def userPic(self):
        return self.__userPic
        pass

    @userPic.setter
    def userPic(self, userPic):
        self.__userPic = userPic
        pass

    @property
    def userBirth(self):
        return self.__userBirth
        pass

    @userBirth.setter
    def userBirth(self, userBirth):
        self.__userBirth = userBirth
        pass

    @property
    def userIntro(self):
        return self.__userIntro
        pass

    @userIntro.setter
    def userIntro(self, userIntro):
        self.__userIntro = userIntro
        pass

    @property
    def userDeptId(self):
        return self.__userDeptId
        pass

    @userDeptId.setter
    def userDeptId(self, userDeptId):
        self.__userDeptId = userDeptId
        pass

    @property
    def userDeptName(self):
        return self.__userDeptName
        pass

    @userDeptName.setter
    def userDeptName(self, userDeptName):
        self.__userDeptName = userDeptName
        pass

    @property
    def userRole(self):
        return self.__userRole
        pass

    @userRole.setter
    def userRole(self, userRole):
        self.__userRole = userRole
        pass
    pass

sessionfilter.py 判断登录用户是否存在,做出相应的处理

from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify

sessionfilter = Blueprint('sessionfilter', __name__)

def sessionFilter(func):
    def inner(*args, **kw):
        user = session.get('user')
        if not user:
            return render_template("login.html")
            pass
        return func(*args, **kw)
        pass
    return inner
    pass

js/userregist.js 含有富文本编辑器,属于ajax的异步文件上传

function  ajaxUploadFile(){
    //创建FormData对象,初始化为form表单中的数据。需要添加其他数据可使用formData.append("property", "value");
    var formData = new FormData($('#regForm')[0]);  // $('#regForm')[0] == document.getElementById('regForm')== document.forms[0] == document.regForm

    //ajax异步上传
    $.ajax({
        url: "/upload.do",
        type: "POST",
        data: formData,  // 1、json对象{}  2、json String 3、formData对象
        xhr: function () { //获取ajaxSettings中的xhr对象,为它的upload属性绑定progress事件的处理函数

            myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) { //检查upload属性是否存在
                //绑定progress事件的回调函数   给
                myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
            }
            return myXhr; //xhr对象返回给jQuery使用
        },
        success: function (result) {
            result = JSON.parse(result);
            $("#userImg").attr("src", result.url); // 前端显示上传完成的图片
            document.regForm.picPath.value = result.url;
            // $("#result").html(result);
        },
        contentType: false, //必须false才会自动加上正确的Content-Type
        processData: false  //必须false才会避开jQuery对 formdata 的默认处理
    });
}

//上传进度回调函数:
function progressHandlingFunction(e) {
    if (e.lengthComputable) {
        $('#progress').attr({ value: e.loaded, max: e.total }); //更新数据到进度条
        var percent = e.loaded / e.total * 100;
        $('#progress').html(e.loaded + "/" + e.total + " bytes. " + percent.toFixed(2) + "%");
        $('#progress').css('width', percent.toFixed(2) + "%");
    }
}

function submitRegist() {
    // 提交之前先对表单进行验证
    var bootstrapValidator = $("#regForm").data("bootstrapValidator");
    bootstrapValidator.validate();
    if(bootstrapValidator.isValid()) {
        var a = document.regForm.userName.value
        $.ajax({
            type: 'post',                            // 传数据的方式
            url: '/regist.do',
            dataType: 'json',                        // xml、json、script、html
            data: JSON.stringify({
                'userName': document.regForm.userName.value,     //  $('#userName') == document.getElementById('userName')
                'userPwd': document.regForm.userPwd.value,
                'userPic': document.regForm.picPath.value,
                'userBirth': document.regForm.userBirth.value,
                'userSex': document.regForm.userSex.value,
                'userIntro': userEditor.getData()  // 重用一个ajax请求实现增加删除修改查询 CRUD
            }),
            error: function (xhr, err) {
                alert('请求失败,请检查,' + err + '!')
            },
            success: function (data, textStatus) {    // success对应的回调函数的第一个参数,是服务器返回的数据
                if (data.result > 0) {
                    alert("注册成功,请登录")
                    $('#modal-info').modal('hide')
                } else {
                    alert("注册失败")
                }
            }
        });
    }
}

$(document).ready(function() {
    $('#regForm').bootstrapValidator({
        message: 'This value is not valid',
        feedbackIcons: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
            userName: {
                message: '用户名验证失败',
                validators: {
                    notEmpty: {
                        message: '用户名不能为空'
                    },
                    stringLength: {
                        min: 6,
                        max: 18,
                        message: '用户名长度必须在6到18位之间'
                    },
                    regexp: {
                        regexp: /^[a-zA-Z]\w{5,17}$/,
                        message: '用户名必须是字母开头,必须由数字、字母组成'
                    }
                }
            },
            userPwd: {
                validators: {
                    notEmpty: {
                        message: '密码不能为空'
                    },
                    stringLength: {
                        min: 6,
                        max: 18,
                        message: '密码长度必须在6到18位之间'
                    },
                    identical: {
                        field: 'reUserPwd',
                        message: '两次密码必须一致'
                    },
                    different: {
                        field: 'userName',
                        message: '密码不能与用户名相同'
                    },
                    regexp: {
                        regexp: /^\w+$/,
                        message: '密码必须由字符组成'
                    }
                }
            },
            reUserPwd: {
                validators: {
                    notEmpty: {
                        message: '确认密码不能为空'
                    },
                    stringLength: {
                        min: 6,
                        max: 18,
                        message: '密码长度必须在6到18位之间'
                    },
                    identical: {
                        field: 'userPwd',
                        message: '两次密码必须一致'
                    },
                    different: {
                        field: 'userName',
                        message: '密码不能与用户名相同'
                    },
                    regexp: {
                        regexp: /^\w+$/,
                        message: '密码必须由字符组成'
                    }
                }
            },
        }
    });
});

userdao.py

from .basedao import BaseDao

class UserDao(BaseDao):

    def findUserByUserName(self, userName):
        try:
            sql = "select * from job_user where user_name=%s"
            self.getConnection()
            self.execute(sql, (userName,))
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def createUser(self, user):
        try:
            param = [user.userName, user.userPwd]
            sql = "insert into job_user (user_name, user_pwd) values(%s, %s)"
            value = "(%s, %s"
            if user.userSex:
                sql += ",user_sex"
                value += ",%s"
                param.append(user.userSex)

            self.getConnection()
            result = self.execute(sql, (user.userName, user.userPwd))
            self.commit() # 执行了sql语句之后要commit
            return result
        finally:
            self.close()
            pass
        pass

    def findUserList(self, user):
        try:
            params = []
            # sql语句和params就需要是动态
            sql = "select * from job_user where 1=1 " #  where 1=1是为了便于增加and
            if user.userName:
                sql += " and user_name like %s "  # 模糊查询
                params.append('%'+user.userName + '%')
                pass
            if user.userSex:
                sql += " and user_sex=%s"
                params.append(user.userSex)
                pass
            self.getConnection()
            self.execute(sql, params)
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def removeUser(self, userId):
        try:
            sql = "delete from job_user where user_id=%s"
            self.getConnection()
            result = self.execute(sql, (userId, ))
            self.commit()  # 执行了sql语句之后要commit
            return result
        finally:
            self.close()
            pass
        pass

    def findUserByUserId(self, userId):
        try:
            sql = "select * from job_user where user_id=%s"
            self.getConnection()
            self.execute(sql, (userId,))
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def updateUser(self, user):
        try:
            sql = "update job_user  set user_sex=%s where user_id=%s"
            self.getConnection()
            result = self.execute(sql, (user.userSex, user.userId))
            self.commit()  # 执行了sql语句之后要commit
            return result
        finally:
            self.close()
            pass
        pass

    def findPageUserList(self, user, pageSize, currentPage):
        try:
            params = []
            # sql语句和params就需要是动态
            sql = "select * from job_user where 1=1 "  # where 1=1是为了便于增加and
            if user.userName:
                sql += " and user_name like %s "  # 模糊查询
                params.append('%' + user.userName + '%')
                pass
            if user.userSex:
                sql += " and user_sex=%s"
                params.append(user.userSex)
                pass

            startRow = (currentPage - 1)*pageSize

            sql += "limit %s, %s"
            params.append(startRow)
            params.append(pageSize)

            self.getConnection()
            self.execute(sql, params)
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def countUsers(self, user):
        params = []
        # sql语句和params就需要是动态
        sql = "select count(*) from job_user where 1=1 "  # where 1=1是为了便于增加and
        if user.userName:
            sql += " and user_name like %s "  # 模糊查询
            params.append('%' + user.userName + '%')
            pass
        if user.userSex:
            sql += " and user_sex=%s"
            params.append(user.userSex)
            pass

        self.getConnection()
        self.execute(sql, params)
        result = self.fetchOne()
        return result
        pass
    pass

userdata.js文件

function getUserData(currentPage, pageSize, opr, userId) {

    var userName =  document.searchForm.userName.value
    var userSex = document.searchForm.userSex.value

    if(opr == 'del'){
        if(!confirm('确定要删除吗?')){
            return false
        }
    }else if(opr == 'submitUpdate'){
        userName = document.userForm.userName.value
        userSex = document.userForm.userSex.value
        userId = document.userForm.userId.value
        currentPage = document.userForm.currentPage.value
        pageSize = document.userForm.pageSize.value
    }

    $.ajax({
        type: 'post',                            // 传数据的方式
        url: '/ajaxuserinfo.do',
        dataType: 'json',                        // xml、json、script、html
        data:JSON.stringify({
            'userName': userName,     //  $('#userName') == document.getElementById('userName')
            'userSex' : userSex,
            'userId': userId,
            'pageSize': pageSize,
            'currentPage': currentPage,
            'opr': opr
        }),
        error: function(xhr, err){
            alert('请求失败,请检查,' + err + '!')
        },
        success: function(data, textStatus){    // success对应的回调函数的第一个参数,是服务器返回的数据
            if(data.code == 1 && opr != 'update'){
                var htmlText = ""
                for(var i =0;i \n' +
                        '            ' + data.userData[i][0] + '\n' +
                        '            ' + data.userData[i][1] + '\n' +
                        '            ' + data.userData[i][4] + '\n' +
                        '            \n' +
                        ' ' +
                        ' '+
                        '            \n' +
                        '        \n'
                }
                pageText = ''+ '当前第' + data.currentPage + '页  总共有' + data.totalPage + '页  ';
                if(data.currentPage <= 1) {
                    pageText += '首页   上一页  ';
                }else{
                     pageText += '首页   ' +
                        '上一页  ';
                }

                if(data.currentPage >= data.totalPage){
                     pageText += '下一页  尾页  ';
                }else {
                    pageText += '下一页  ' +
                    '尾页  ';
                }
                pageText +='总共有'+ data.counts + '条  '
                $('#dataBody').empty()
                $('#dataBody').append(htmlText)
                $('#dataBody').append(pageText)

                document.searchForm.currentPage.value = data.currentPage
                document.searchForm.pageSize.value=data.pageSize

            }else if(data.code == 1 && opr == 'update'){
                document.userForm.userName.value = data.userData.userName
                document.userForm.userSex.value = data.userData.userSex
                document.userForm.userId.value = data.userData.userId
                document.userForm.currentPage.value = data.currentPage
                document.userForm.pageSize.value = data.pageSize
                $('#modal-default').modal()
            }
        }
    });
}
$(document).ready(
    function(){
        getUserData(1, 10, 'search', 0)
    }
)

然后是前端页面代码:

top.html




  
  
  智能职位数据分析平台
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

  


left.html


  

main.html

{% include 'top.html' %}
{% include 'left.html' %}

  

职位分布 IT行业之分分析

开发语言薪资对比图

To Do List

  • Design a nice theme 2 mins
  • Make the theme responsive 4 hours
  • Let theme shine like a star 1 day
  • Let theme shine like a star 3 days
  • Check your messages and notifications 1 week
  • Let theme shine like a star 1 month

Quick Email

开发语言职位占比

Sales Graph

{% include 'footer.html' %}

footer.html

Copyright © 2014-2016 Almsaeed Studio. All rights reserved.

index.html 登录之后的页面,其中含有注册弹窗



	
		
		职位分析系统主页
        
        
        
        
        
        
        
        
        
        
        
        
        
	
	
		
		
  • 用户信息管理
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
  • 人工智能
左广告
右广告

login.html 登录界面




  
  
  登录
  
  
  
  
  
  
  
  
  
  

  











你可能感兴趣的:(jQuery,Ajax,Flask框架)