基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)

本文深入探讨了Flask轻量级Web框架的特点及其在Python开发中的应用,同时详细解析了MVC(Model-View-Controller)设计模式的原理与实践,通过具体示例展示了如何在Flask项目中实施MVC模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask框架:

  • Flask 是 Python 编写的一款轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2。Flask 使用 BSD 授权。其中两个环境依赖是 Werkzeug 和 jinja2,这意味着它不需要依赖外部库。正因如此,我们将其称为轻量级框架。
  • Flask属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖外部库的框架。
    • 框架很轻量
    • 更新时依赖小
    • 专注于安全方面的bug
      ————————————————

MVC框架原理:

  • MVC是一种架构设计模式,是一种设计理念。是为了达到分层设计的目的,从而使代码解耦,便于维护和代码的复用。MVC是3个单词的缩写,全称:Model-View-Controller(模型-视图-控制器)。

  • 1、Model

    模型层,可以简单理解就是数据层,用于提供数据。在项目中,(简单理解)一般把数据访问和操作,比如将对象关系映射这样的代码作为Model层,也就是对数据库的操作这一些列的代码作为Model层。比如代码中我们会写DAO和DTO类型的代码,那这个DAO和DTO我们可以理解为是属于Model层的代码。

  • 2、View

    视图层,就是UI界面,用于跟用户进行交互。一般所有的JSP、Html等页面就是View层。

  • 3、Controller

    控制层,Controller层的功能就是将Model和View层进行关联。比如View主要是显示数据的,但是数据又需要Model去访问,这样的话,View会先告诉Controller,然后Controller再告诉Model,Model请求完数据之后,再告诉View。这样View就可以显示数据了。

在这里插入图片描述

下面是一个实例:

实现效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码 及结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
话不多说上代码:
controller
——usercontroller.py

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

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) #  业务逻辑层 dao:database access object model
    print(result)
    if result and  result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
        userItem = {}
        userItem['userId'] = result[0][0]
        userItem['userName'] = result[0][1]
        userItem['userPic'] = result[0][9]
        userItem['userRole'] = result[0][13]
        session['user'] = userItem # session是http协议的状态跟踪技术,http协议是tcp短连接
        # sessionDict[sessionid][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('/regist.do', methods=['POST', 'GET'])
def regist():
    userData = request.get_data()
    userDict = json.loads(userData)

    user = User()
    user.userName = userDict.get('userName')  # 表单提交的数据使用request.form[]
    user.userPwd =  hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest()
    user.userPic =  userDict.get('userPic')
    user.userBirth =  userDict.get('userBirth')
    user.userSex = userDict.get('userSex')
    user.userIntro =  userDict.get('userIntro')

    result = userService.createUser(user)

    return json.dumps({'result':result})
    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') # 超链接http默认是get请求
    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'], endpoint='goAjaxUserInfo')
@sessionFilter
@roleFilter
def goAjaxUserInfo():
    return render_template("systeminfo/userinfo.html")
    pass

@usercontroller.route('/ajaxuserinfo.do', methods=['POST', 'GET'], endpoint='getUserInfo')
@sessionFilter
@roleFilter
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
    user.userDeptId = int(userDict.get('userDeptId'))

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

        return json.dumps(returnData)
    elif opr == 'submitUpdate':
        updateResult = 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, 'updateResult':updateResult, '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')
    if file:
        try:
            file.save(os.path.dirname(__file__) + os.sep + '..' + os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.filename)  # 保存文件到upload目录
        except Exception as e:
            return json.dumps({'uploaded': 0, 'fileName': "", 'url': ""})
            pass
        return json.dumps({'uploaded': 1, 'fileName':file.filename, 'url': os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.filename})
    else:
        return json.dumps({'uploaded': 0, 'fileName': "", 'url': ""})
    pass

——jobcontroller.py

from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify
import hashlib
from service.jobtaskservice import JobTaskService
from entity.jobtask import JobTask
import json
from filter.sessionfilter import sessionFilter

jobtaskcontroller = Blueprint('jobtaskcontroller', __name__)
jobTaskService = JobTaskService()

@jobtaskcontroller.route('/goajaxjobtaskinfo.do', methods=['POST', 'GET'])
@sessionFilter
def goJobTaskInfo():
    return render_template("jobinfo/jobtaskinfo.html")
    pass

@jobtaskcontroller.route('/ajaxjobtaskinfo.do', methods=['POST', 'GET'])
def getJobTaskInfo():
    jobTaskData = request.get_data()
    jobTaskDict = json.loads(jobTaskData)
    tData = {}

    jobTask = JobTask()
    jobTask.taskTitle = jobTaskDict.get('taskTitle')
    jobTask.taskURL = jobTaskDict.get('taskURL')

    currentPage = int(jobTaskDict.get('currentPage'))
    pageSize = int(jobTaskDict.get('pageSize'))
    opr = jobTaskDict.get('opr')
    taskId = int(jobTaskDict.get('taskId'))
    jobTask.taskId = taskId

    updateResult = 0
    if opr == 'del':
        updateResult = jobTaskService.removeJobTask(taskId)
        pass
    elif opr == 'update':
        tTask = jobTaskService.findJobTaskByJobTaskId(taskId)
        tData['taskId'] = tTask.taskId
        tData['taskTitle'] = tTask.taskTitle
        tData['taskURL'] = tTask.taskURL
        returnData = {'code': 1, 'jobTaskData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}

        return json.dumps(returnData)
    elif opr == 'submitUpdate':
        updateResult = jobTaskService.updateJobTask(jobTask)
        pass

    result = jobTaskService.findPageJobTaskList(jobTask, pageSize, currentPage)
    counts = jobTaskService.countJobTasks(jobTask)
    totalPage = 0

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

    returnData = {'code':1, 'jobTaskData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts}

    return json.dumps(returnData)
    pass

@jobtaskcontroller.route('/ajaxjobsalary.do', methods=['POST', 'GET'])
def getJobSalary():
    result = jobTaskService.findJobMeanSalary()
    returnData = {'code':1, 'salary':result}
    r = json.dumps(returnData)
    return json.dumps(returnData)
    pass

dao
——pymysql.json

{"host":"127.0.0.1", "user":"root","password":"root", "database":"db_job_data", "port":3306, "charset":"utf8"}

——basedao.py

import pymysql
import json
import logging
import os

class BaseDao(): # DAO: database access object

    def __init__(self, configFile='pymysql.json'):
        self.__connection = None
        self.__cursor = None
        self.__config = json.load(open(os.path.dirname(__file__) + os.sep + configFile, 'r'))  # 通过json配置获得数据的连接配置信息
        print(self.__config)
        pass

    # 获取数据库连接的方法
    def getConnection(self):
        # 当有连接对象时,直接返回连接对象
        if self.__connection:
            return self.__connection
        # 否则通过建立新的连接对象
        try:
            self.__connection = pymysql.connect(**self.__config)
            return self.__connection
        except pymysql.MySQLError as e:
            print("Exception:" + str(e))
            pass
        pass

    # 用于执行sql语句的通用方法 # sql注入
    def execute(self, sql, params=None):
        try:
            self.__cursor = self.getConnection().cursor()
            # result返回sql语句影响到的条数
            if params: # 带参数sql语句
                result = self.__cursor.execute(sql, params)
            else:      # 不带参数sql语句
                result = self.__cursor.execute(sql)
            return result
        except (pymysql.MySQLError, pymysql.DatabaseError, Exception) as e:
            print("出现数据库访问异常:" + str(e))
            self.rollback()
            pass
        finally:
            pass
        pass

    def fetch(self):
        if self.__cursor:
            return self.__cursor.fetchall()
        pass

    def fetchOne(self):
        if self.__cursor:
            return self.__cursor.fetchone()
        pass

    def commit(self):
        if self.__connection:
            self.__connection.commit()
        pass

    def rollback(self):
        if self.__connection:
            self.__connection.rollback()
        pass

    # 返回最后的自增主键
    def getLastRowId(self):
        if self.__cursor:
            return self.__cursor.lastrowid
        pass

    def close(self):
        if self.__cursor:
            self.__cursor.close()
        if self.__connection:
            self.__connection.close()
        pass

    pass



——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:
            params = [user.userName, user.userPwd]
            sql = "insert into job_user (user_name, user_pwd"
            values = " values (%s, %s"
            if user.userSex:
                sql += ",user_sex"
                values += ",%s"
                params.append(user.userSex)
                pass
            if user.userPic:
                sql += ",user_pic"
                values += ",%s"
                params.append(user.userPic)
                pass
            if user.userIntro:
                sql += ",user_intro"
                values += ",%s"
                params.append(user.userIntro)
                pass
            if user.userBirth:
                sql += ",user_birth"
                values += ",DATE_FORMAT(%s,'%%Y-%%m-%%d')"
                params.append(user.userBirth)
                pass
            sql +=")" + values + ")"
            self.getConnection()
            result = self.execute(sql, params)
            self.commit() # 执行了sql语句之后要commit
            return result
        except Exception as e:
            print(e)
        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 USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \
                  "USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \
                  "from job_user left join job_dept on job_user.user_deptid=job_dept.dept_id   where user_id=%s "  # where 1=1是为了便于增
            self.getConnection()
            self.execute(sql, (userId,))
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def updateUser(self, user):
        try:
            params = [user.userSex]
            sql = "update job_user  set user_sex=%s "
            if user.userDeptId > 0:
                sql += ", user_deptid=%s"
                params.append(user.userDeptId)
            sql += ' where user_id=%s'
            params.append(user.userId)

            self.getConnection()
            result = self.execute(sql, params)
            self.commit()  # 执行了sql语句之后要commit
            return result
        except Exception as e:
            print(e)
        finally:
            self.close()
            pass
        pass

    def findPageUserList(self, user, pageSize, currentPage):
        try:
            params = []
            # sql语句和params就需要是动态
            sql = "select USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \
                  "USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \
                  "from job_user left join job_dept on job_user.user_deptid=job_dept.dept_id   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 u left join job_dept d on u.user_deptid=d.dept_id  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

——jobtaskdao.py

from .basedao import BaseDao

class JobTaskDao(BaseDao):

    def createJobTask(self, jobTask):
        try:
            sql = "insert into job_collect_task (task_title, job_url) values(%s, %s)"
            self.getConnection()
            result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL))
            self.commit() # 执行了sql语句之后要commit
            return result
        finally:
            self.close()
            pass
        pass

    def findJobTaskList(self, jobTask):
        try:
            params = []
            # sql语句和params就需要是动态
            sql = "select * from job_collect_task where 1=1 " #  where 1=1是为了便于增加and
            if jobTask.taskTitle:
                sql += " and task_title like %s "  # 模糊查询
                params.append('%'+jobTask.taskTitle + '%')
                pass
            if jobTask.taskURL:
                sql += " and task_url=%s"
                params.append(jobTask.taskURL)
                pass
            self.getConnection()
            self.execute(sql, params)
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

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

    def findJobTaskByJobTaskId(self, taskId):
        try:
            sql = "select * from job_collect_task where task_id=%s"
            self.getConnection()
            self.execute(sql, (taskId,))
            result = self.fetch()
        finally:
            self.close()

        return result
        pass

    def updateJobTask(self, jobTask):
        try:
            sql = "update job_collect_task  set task_title=%s, task_url=%s where task_id=%s"
            self.getConnection()
            result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL, jobTask.taskId))
            self.commit()  # 执行了sql语句之后要commit
            return result
        finally:
            self.close()
            pass
        pass

    def findPageJobTaskList(self, jobTask, pageSize, currentPage):
        try:
            params = []
            # sql语句和params就需要是动态
            sql = "select task_id, task_title, task_url from job_collect_task where 1=1 "  # where 1=1是为了便于增加and
            if jobTask.taskTitle:
                sql += " and task_title like %s "  # 模糊查询
                params.append('%' + jobTask.taskTitle + '%')
                pass
            if jobTask.taskURL:
                sql += " and task_url=%s"
                params.append(jobTask.taskURL)
                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 countJobTasks(self, jobTask):
        params = []
        # sql语句和params就需要是动态
        sql = "select count(*) from job_collect_task where 1=1 "  # where 1=1是为了便于增加and
        if jobTask.taskTitle:
            sql += " and task_title like %s "  # 模糊查询
            params.append('%' + jobTask.taskTitle + '%')
            pass
        if jobTask.taskURL:
            sql += " and task_url=%s"
            params.append(jobTask.taskURL)
            pass

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

entity
——user.py

# 封装数据类 VO:value object  entity 类
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

filter
防止非法访问过滤器
——rolefilter

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

rolefilter = Blueprint('rolefilter', __name__)

def roleFilter(funcs):
    adminURL = ['ajaxuserinfo.do','goajaxuserinfo.do']
    def innerRole(*args, **kw):
        user = session.get('user')
        if user:
            role = user.get('userRole') # restful
            url = request.url
            url = url.split('/')[-1]
            if role != 1 and url in adminURL:
                session.clear()
                return render_template("login.html")
            pass
        return funcs(*args, **kw)
        pass
    return innerRole
    pass

——sessionfilter

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

service
——userservice

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][4]
            user.userDeptId = result[0][13]
            user.userDeptName = result[0][14]
            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

——jobtaskservice

from dao.jobtaskdao import JobTaskDao
from dao.jobpostiondao import JobPositionDao
from entity.jobtask import JobTask

class JobTaskService:
    def createJobTask(self, jobTask):
        jobTaskDao = JobTaskDao()
        return jobTaskDao.createJobTask(jobTask)
        pass

    def findJobTaskList(self, jobTask):
        jobTaskDao = JobTaskDao()
        jobTasklist = []
        result = jobTaskDao.findJobTaskList(jobTask)
        for temp in result:
            tjobTask = JobTask()
            tjobTask.taskId = temp[0]
            tjobTask.taskTitle = temp[1]
            tjobTask.taskURL = temp[4]
            jobTasklist.append(tjobTask)
            pass
        return jobTasklist
        pass

    def removeJobTask(self, taskId):
        jobTaskDao = JobTaskDao()
        return jobTaskDao.removeJobTask(taskId)
        pass

    def findJobTaskByJobTaskId(self, taskId):
        jobTaskDao = JobTaskDao()
        result = jobTaskDao.findJobTaskByJobTaskId(taskId)
        jobTask = None
        if result:
            jobTask = JobTask()
            jobTask.taskId = result[0][0]
            jobTask.taskTitle = result[0][1]
            jobTask.taskURL = result[0][2]
            pass
        return jobTask
        pass

    # 修改用户信息
    def updateJobTask(self, jobTask):
        jobTaskDao = JobTaskDao()
        return jobTaskDao.updateJobTask(jobTask)
        pass

    def findPageJobTaskList(self, jobTask, pageSize, currentPage):
        jobTaskDao = JobTaskDao()
        return jobTaskDao.findPageJobTaskList(jobTask, pageSize, currentPage)
        pass

    def countJobTasks(self, jobTask):
        jobTaskDao = JobTaskDao()
        return jobTaskDao.countJobTasks(jobTask)[0]
        pass

    def findJobMeanSalary(self):
        jpd = JobPositionDao()
        return jpd.findPositionClassify()
        pass
    pass

js
——userdata.js

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

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

    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
        userDeptId = document.userForm.userDeptId.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,
            'userDeptId': userDeptId,
            'pageSize': pageSize,
            'currentPage': currentPage,
            'opr': opr  // 重用一个ajax请求实现增加删除修改查询 CRUD
        }),
        error: function(xhr, err){
            alert('请求失败,请检查,' + err + '!')
        },
        success: function(data, textStatus){    // success对应的回调函数的第一个参数,是服务器返回的数据
            // data = JSON.parse(data)
            if(data.code == 1 && opr != 'update'){
                var htmlText = ""
                for(var i =0;i <data.userData.length;i++){
                    htmlText += '<tr>' +
                        '            <td align="center"><input type="checkbox" name="userId" value="'+  data.userData[i][0] +'" /></td>\n' +
                        '            <td>' + data.userData[i][0] + '</td>\n' +
                        '            <td>' + data.userData[i][1] + '</td>\n' +
                        '            <td>' + (data.userData[i][4] == 1 ? '男':'女') + '</td>\n' +
                           '         <td>' + data.userData[i][14] + '</td>\n' +
                        '            <td style="width: 160px;">\n' +
                        ' <button type="button" class="btn btn-danger" οnclick="getUserData('+ data.currentPage +',' + data.pageSize + ','+ '\'del\''+',' + data.userData[i][0] +')">删除</button>' +
                        ' <button type="button" class="btn btn-info" οnclick="getUserData('+ data.currentPage +',' + data.pageSize + ','+ '\'update\''+',' + data.userData[i][0] +')">修改</button>'+
                        '            </td>\n' +
                        '        </tr>\n'
                }
                pageText = '<tr style="text-align: right;"><td colspan="6">'+ '当前第' + data.currentPage + '页&nbsp;&nbsp;总共有' + data.totalPage + '页&nbsp;&nbsp;';
                if(data.currentPage <= 1) {
                    pageText += '首页 &nbsp;&nbsp;上一页&nbsp;&nbsp;';
                }else{
                     pageText += '<a href="javascript:getUserData(1,10,\'search\', 0);">首页</a> &nbsp;&nbsp;' +
                        '<a href="javascript:getUserData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a>&nbsp;&nbsp;';
                }

                if(data.currentPage >= data.totalPage){
                     pageText += '下一页&nbsp;&nbsp;尾页&nbsp;&nbsp;';
                }else {
                    pageText += '<a href="javascript:getUserData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a>&nbsp;&nbsp;' +
                    '<a href="javascript:getUserData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a>&nbsp;&nbsp;';
                }
                pageText +='总共有'+ data.counts + '条&nbsp;&nbsp;</td></tr>'
                $('#dataBody').empty()
                $('#dataBody').append(htmlText)
                $('#dataBody').append(pageText)

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

                 if( opr != 'search' && data.updateResult > 0 ) {
                     alert("操作成功")
                     $('#modal-default').modal('hide')

                 }else if(opr != 'search' && data.updateResult <= 0){
                     alert("操作失败")
                 }

            }else if(data.code == 1 && opr == 'update'){
                document.userForm.userName.value = data.userData.userName
                if(data.userData.userSex == 1){
                    document.getElementById('male').checked = 'checked'
                }else if(data.userData.userSex == 2){
                    document.getElementById('female').checked = 'checked'
                }
                document.userForm.userId.value = data.userData.userId
                $('#userDept').html(data.userData.userDeptName)
                document.userForm.userDeptId.value =  data.userData.userDeptId
                document.userForm.currentPage.value = data.currentPage
                document.userForm.pageSize.value = data.pageSize
                $('#modal-default').modal()
                getDeptList(0, null, 1)
            }
        }
    });
}
function getDeptList(parentId, obj, grade){
    if(parentId == -1){
        parentId = obj.value
        document.userForm.userDeptId.value = obj.value
    }else if(parentId == -99 || grade == 4){
        return false
    }
     $.ajax({
         type: 'get',                            // 传数据的方式
         url: '/getdeptlist.do',
         data:{
             'parentId': parentId,     //  $('#userName') == document.getElementById('userName')
         },
         error: function (xhr, err) {
             alert('请求失败,请检查,' + err + '!')
         },
         success: function (data, textStatus) {    // success对应的回调函数的第一个参数,是服务器返回的数据
             data = JSON.parse(data)
            if(parentId == 0){
                 if(data.code == 1){
                     htmlText = '<option value="-99">选择部门</option>'
                     for(var i=0;i<data.data.length;i++){
                         htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>'
                     }
                     $('#parentDept').html(htmlText)
                 }
            }else{
                if(data.code == 1 && grade == 2){
                     if(document.getElementById('gradeTwoDept')){
                        $('#gradeTwoDept').remove()
                     }
                     if(document.getElementById('gradeTreeDept')){
                         $('#gradeTreeDept').remove()
                     }
                     htmlText = '<select id="gradeTwoDept" οnchange="getDeptList(-1, this,3)" >'
                     htmlText += '<option value="-99">选择子部门</option>'
                     for(var i=0;i<data.data.length;i++){
                         htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>'
                     }
                     htmlText += "</select>"
                     $('#deptContainer').append(htmlText)
                 }else if(data.code == 1 && grade == 3){
                       if(document.getElementById('gradeTreeDept')){
                         $('#gradeTreeDept').remove()
                     }
                     htmlText = '<select id="gradeTreeDept" οnchange="getDeptList(-1, this, 4)" >'
                     htmlText += '<option value="-99">选择子部门</option>'
                     for(var i=0;i<data.data.length;i++){
                         htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>'
                     }
                     htmlText += "</select>"
                     $('#deptContainer').append(htmlText)
                }
            }
         }
     })
}
$(document).ready(
    function(){
        getUserData(1, 10, 'search', 0)
    }
)

——jobtask.js

function getJobTaskData(currentPage, pageSize, opr, taskId) {

    var taskTitle =  document.searchForm.taskTitle.value
    var taskURL = document.searchForm.taskURL.value

    if(opr == 'del'){
        if(!confirm('确定要删除吗?')){
            return false
        }
    }else if(opr == 'submitUpdate'){
        taskTitle = document.taskForm.taskTitle.value
        taskURL = document.taskForm.taskURL.value
        taskId = document.taskForm.taskId.value
        currentPage = document.taskForm.currentPage.value
        pageSize = document.taskForm.pageSize.value
        $('#modal-default').modal('hide')
    }

    $.ajax({
        type: 'post',                            // 传数据的方式
        url: '/ajaxjobtaskinfo.do',
        dataType: 'json',                        // xml、json、script、html
        data:JSON.stringify({
            'taskTitle': taskTitle,     //  $('#taskTitle') == document.getElementById('taskTitle')
            'taskURL' : taskURL,
            'taskId': taskId,
            'pageSize': pageSize,
            'currentPage': currentPage,
            'opr': opr
        }),
        error: function(xhr, err){
            alert('请求失败,请检查,' + err + '!')
        },
        success: function(data, textStatus){    // success对应的回调函数的第一个参数,是服务器返回的数据
            // 查询后、删除后、修改后都走这个if
            if(data.code == 1 && opr != 'update'){
                var htmlText = ""
                for(var i =0;i <data.jobTaskData.length;i++){
                    htmlText += '<tr>' +
                        '            <td align="center"><input type="checkbox" name="taskId" value="'+  data.jobTaskData[i][0] +'" /></td>\n' +
                        '            <td>' + data.jobTaskData[i][0] + '</td>\n' +
                        '            <td>' + data.jobTaskData[i][1] + '</td>\n' +
                        '            <td style="width: 500px;word-break: break-all;">' + data.jobTaskData[i][2] + '</td>\n' +
                        '            <td style="width: 160px;">\n' +
                        ' <button type="button" class="btn btn-danger" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'del\''+',' + data.jobTaskData[i][0] +')">删除</button>' +
                        ' <button type="button" class="btn btn-info" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'update\''+',' + data.jobTaskData[i][0] +')">修改</button>'+
                        '            </td>\n' +
                        '        </tr>\n'
                }
                pageText = '<tr style="text-align: right;"><td colspan="5">'+ '当前第' + data.currentPage + '页&nbsp;&nbsp;总共有' + data.totalPage + '页&nbsp;&nbsp;';
                if(data.currentPage <= 1) {
                    pageText += '首页 &nbsp;&nbsp;上一页&nbsp;&nbsp;';
                }else{
                     pageText += '<a href="javascript:getJobTaskData(1,10,\'search\', 0);">首页</a> &nbsp;&nbsp;' +
                        '<a href="javascript:getJobTaskData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a>&nbsp;&nbsp;';
                }

                if(data.currentPage >= data.totalPage){
                     pageText += '下一页&nbsp;&nbsp;尾页&nbsp;&nbsp;';
                }else {
                    pageText += '<a href="javascript:getJobTaskData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a>&nbsp;&nbsp;' +
                    '<a href="javascript:getJobTaskData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a>&nbsp;&nbsp;';
                }
                pageText +='总共有'+ data.counts + '条&nbsp;&nbsp;</td></tr>'
                $('#dataBody').empty()
                $('#dataBody').append(htmlText)
                $('#dataBody').append(pageText)

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

                 if( opr != 'search' && data.updateResult > 0 ) {
                     alert("操作成功")
                 }else if(opr != 'search' && data.updateResult <= 0){
                     alert("操作失败")
                 }
            }else if(data.code == 1 && opr == 'update'){
                document.taskForm.taskTitle.value = data.jobTaskData.taskTitle
                document.taskForm.taskURL.value = data.jobTaskData.taskURL
                document.taskForm.taskId.value = data.jobTaskData.taskId
                document.taskForm.currentPage.value = data.currentPage
                document.taskForm.pageSize.value = data.pageSize
                $('#modal-default').modal()
            }
        }
    });
}
$(document).ready(
    function(){
        getJobTaskData(1, 10, 'search', 0)
    }
)

前端页面:
top.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>智能职位数据分析平台</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.7 -->
  <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap/dist/css/bootstrap.min.css') }}">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="{{ url_for('static',filename='font-awesome/css/font-awesome.min.css') }}">
  <!-- Ionicons -->
  <link rel="stylesheet" href="{{ url_for('static',filename='Ionicons/css/ionicons.min.css') }}">
  <!-- Theme style -->
  <link rel="stylesheet" href="{{ url_for('static',filename='css/AdminLTE.min.css') }}">
  <!-- AdminLTE Skins. Choose a skin from the css/skins
       folder instead of downloading all of them to reduce the load. -->
  <link rel="stylesheet" href="{{ url_for('static',filename='css/skins/_all-skins.min.css') }}">
  <!-- Morris chart -->
  <link rel="stylesheet" href="{{ url_for('static',filename='morris.js/morris.css') }}">
  <!-- jvectormap -->
  <link rel="stylesheet" href="{{ url_for('static',filename='jvectormap/jquery-jvectormap.css') }}">
  <!-- Date Picker -->
  <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css') }}">
  <!-- Daterange picker -->
  <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap-daterangepicker/daterangepicker.css') }}">

  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">

  <header class="main-header">
    <!-- Logo -->
    <a href="/main" class="logo">
      <!-- mini logo for sidebar mini 50x50 pixels -->
      <span class="logo-mini"><b>Job
      </b>Hutter</span>
      <!-- logo for regular state and mobile devices -->
      <span class="logo-lg"><b>职位数据分析</b>平台</span>
    </a>
    <!-- Header Navbar: style can be found in header.less -->
    <nav class="navbar navbar-static-top">
      <!-- Sidebar toggle button-->
      <a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
        <span class="sr-only">Toggle navigation</span>
      </a>

      <div class="navbar-custom-menu">
        <ul class="nav navbar-nav">
          <!-- Messages: style can be found in dropdown.less-->
          <li class="dropdown messages-menu">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              <i class="fa fa-envelope-o"></i>
              <span class="label label-success">4</span>
            </a>
            <ul class="dropdown-menu">
              <li class="header">You have 4 messages</li>
              <li>
                <!-- inner menu: contains the actual data -->
                <ul class="menu">
                  <li><!-- start message -->
                    <a href="#">
                      <div class="pull-left">
                        <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image">
                      </div>
                      <h4>
                        Support Team
                        <small><i class="fa fa-clock-o"></i> 5 mins</small>
                      </h4>
                      <p>Why not buy a new awesome theme?</p>
                    </a>
                  </li>
                  <!-- end message -->
                  <li>
                    <a href="#">
                      <div class="pull-left">
                        <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image">
                      </div>
                      <h4>
                        AdminLTE Design Team
                        <small><i class="fa fa-clock-o"></i> 2 hours</small>
                      </h4>
                      <p>Why not buy a new awesome theme?</p>
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <div class="pull-left">
                        <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image">
                      </div>
                      <h4>
                        Developers
                        <small><i class="fa fa-clock-o"></i> Today</small>
                      </h4>
                      <p>Why not buy a new awesome theme?</p>
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <div class="pull-left">
                        <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image">
                      </div>
                      <h4>
                        Sales Department
                        <small><i class="fa fa-clock-o"></i> Yesterday</small>
                      </h4>
                      <p>Why not buy a new awesome theme?</p>
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <div class="pull-left">
                        <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image">
                      </div>
                      <h4>
                        Reviewers
                        <small><i class="fa fa-clock-o"></i> 2 days</small>
                      </h4>
                      <p>Why not buy a new awesome theme?</p>
                    </a>
                  </li>
                </ul>
              </li>
              <li class="footer"><a href="#">See All Messages</a></li>
            </ul>
          </li>
          <!-- Notifications: style can be found in dropdown.less -->
          <li class="dropdown notifications-menu">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              <i class="fa fa-bell-o"></i>
              <span class="label label-warning">10</span>
            </a>
            <ul class="dropdown-menu">
              <li class="header">You have 10 notifications</li>
              <li>
                <!-- inner menu: contains the actual data -->
                <ul class="menu">
                  <li>
                    <a href="#">
                      <i class="fa fa-users text-aqua"></i> 5 new members joined today
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the
                      page and may cause design problems
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <i class="fa fa-users text-red"></i> 5 new members joined
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <i class="fa fa-shopping-cart text-green"></i> 25 sales made
                    </a>
                  </li>
                  <li>
                    <a href="#">
                      <i class="fa fa-user text-red"></i> You changed your username
                    </a>
                  </li>
                </ul>
              </li>
              <li class="footer"><a href="#">View all</a></li>
            </ul>
          </li>
          <!-- Tasks: style can be found in dropdown.less -->
          <li class="dropdown tasks-menu">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              <i class="fa fa-flag-o"></i>
              <span class="label label-danger">9</span>
            </a>
            <ul class="dropdown-menu">
              <li class="header">You have 9 tasks</li>
              <li>
                <!-- inner menu: contains the actual data -->
                <ul class="menu">
                  <li><!-- Task item -->
                    <a href="#">
                      <h3>
                        Design some buttons
                        <small class="pull-right">20%</small>
                      </h3>
                      <div class="progress xs">
                        <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar"
                             aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
                          <span class="sr-only">20% Complete</span>
                        </div>
                      </div>
                    </a>
                  </li>
                  <!-- end task item -->
                  <li><!-- Task item -->
                    <a href="#">
                      <h3>
                        Create a nice theme
                        <small class="pull-right">40%</small>
                      </h3>
                      <div class="progress xs">
                        <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar"
                             aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
                          <span class="sr-only">40% Complete</span>
                        </div>
                      </div>
                    </a>
                  </li>
                  <!-- end task item -->
                  <li><!-- Task item -->
                    <a href="#">
                      <h3>
                        Some task I need to do
                        <small class="pull-right">60%</small>
                      </h3>
                      <div class="progress xs">
                        <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar"
                             aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
                          <span class="sr-only">60% Complete</span>
                        </div>
                      </div>
                    </a>
                  </li>
                  <!-- end task item -->
                  <li><!-- Task item -->
                    <a href="#">
                      <h3>
                        Make beautiful transitions
                        <small class="pull-right">80%</small>
                      </h3>
                      <div class="progress xs">
                        <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar"
                             aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
                          <span class="sr-only">80% Complete</span>
                        </div>
                      </div>
                    </a>
                  </li>
                  <!-- end task item -->
                </ul>
              </li>
              <li class="footer">
                <a href="#">View all tasks</a>
              </li>
            </ul>
          </li>
          <!-- User Account: style can be found in dropdown.less -->
          <li class="dropdown user user-menu">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              <img src="{{ session.get('user').get('userPic') }}" class="user-image" alt="User Image">
              <span class="hidden-xs">{{ session.get('user').get('userName')}}</span>
            </a>
            <ul class="dropdown-menu">
              <!-- User image -->
              <li class="user-header">
                <img src="{{ session.get('user').get('userPic') }}" class="img-circle" alt="User Image">

                <p>
                  {{ session.get('user').get('userName') }}
                  <small></small>
                </p>
              </li>
              <!-- Menu Body -->
              <li class="user-body">
                <div class="row">
                  <div class="col-xs-4 text-center">
                    <a href="#">Followers</a>
                  </div>
                  <div class="col-xs-4 text-center">
                    <a href="#">Sales</a>
                  </div>
                  <div class="col-xs-4 text-center">
                    <a href="#">Friends</a>
                  </div>
                </div>
                <!-- /.row -->
              </li>
              <!-- Menu Footer-->
              <li class="user-footer">
                <div class="pull-left">
                  <a href="#" class="btn btn-default btn-flat">个人信息</a>
                </div>
                <div class="pull-right">
                  <a href="/logout.do" class="btn btn-default btn-flat">退出</a>
                </div>
              </li>
            </ul>
          </li>
          <!-- Control Sidebar Toggle Button -->
          <li>
            <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
          </li>
        </ul>
      </div>
    </nav>
  </header>

left.html

<!-- Left side column. contains the logo and sidebar -->
  <aside class="main-sidebar">
    <!-- sidebar: style can be found in sidebar.less -->
    <section class="sidebar">
      <!-- sidebar menu: : style can be found in sidebar.less -->
      <ul class="sidebar-menu" data-widget="tree">
        <li class="header">导航菜单</li>
        <li class="active treeview">
          <a href="#">
            <i class="fa fa-dashboard"></i> <span>数据分析管理</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li class="active"><a href="/main"><i class="fa fa-circle-o"></i> 职位分析报表</a></li>
            <li><a href="/main"><i class="fa fa-circle-o"></i> 行业分析报表</a></li>
          </ul>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-files-o"></i>
            <span>职位数据采集</span>
            <span class="pull-right-container">
              <span class="label label-primary pull-right">4</span>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="/goajaxjobtaskinfo.do"><i class="fa fa-circle-o"></i> 采集任务管理</a></li>
            <li><a href="/goajaxgoodsinfo.do"><i class="fa fa-circle-o"></i> 购物管理</a></li>
            <li><a href="/goajaxtypeinfo.do"><i class="fa fa-circle-o"></i> 购物类型管理</a></li>
            <li><a href="pages/layout/boxed.html"><i class="fa fa-circle-o"></i> 采集结果分析</a></li>
            <li><a href="pages/layout/fixed.html"><i class="fa fa-circle-o"></i> 采集数据管理</a></li>
          </ul>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-laptop"></i>
            <span>个人事务管理</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="pages/UI/general.html"><i class="fa fa-circle-o"></i> 个人信息管理</a></li>
            <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> 待办事项管理</a></li>
            <li><a href="pages/UI/buttons.html"><i class="fa fa-circle-o"></i> 内部消息管理</a></li>
            <li><a href="pages/UI/sliders.html"><i class="fa fa-circle-o"></i> 密码管理</a></li>
          </ul>
        </li>
        {% if session.get('user').get('userRole') == 1 %}
        <li class="treeview">
          <a href="#">
            <i class="fa fa-pie-chart"></i>
            <span>系统功能管理</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="/goajaxuserinfo.do"><i class="fa fa-circle-o"></i> 用户管理</a></li>
            <li><a href="pages/charts/morris.html"><i class="fa fa-circle-o"></i> 角色管理</a></li>
            <li><a href="pages/charts/flot.html"><i class="fa fa-circle-o"></i> 权限管理</a></li>
            <li><a href="pages/charts/inline.html"><i class="fa fa-circle-o"></i> 系统参数管理</a></li>
          </ul>
        </li>
        {% endif %}
        <li class="treeview">
          <a href="#">
            <i class="fa fa-edit"></i> <span>Forms</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="pages/forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li>
            <li><a href="pages/forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li>
            <li><a href="pages/forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li>
          </ul>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-table"></i> <span>Tables</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="pages/tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li>
            <li><a href="pages/tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li>
          </ul>
        </li>
        <li>
          <a href="pages/calendar.html">
            <i class="fa fa-calendar"></i> <span>Calendar</span>
            <span class="pull-right-container">
              <small class="label pull-right bg-red">3</small>
              <small class="label pull-right bg-blue">17</small>
            </span>
          </a>
        </li>
        <li>
          <a href="pages/mailbox/mailbox.html">
            <i class="fa fa-envelope"></i> <span>Mailbox</span>
            <span class="pull-right-container">
              <small class="label pull-right bg-yellow">12</small>
              <small class="label pull-right bg-green">16</small>
              <small class="label pull-right bg-red">5</small>
            </span>
          </a>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-folder"></i> <span>Examples</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="pages/examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li>
            <li><a href="pages/examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li>
            <li><a href="pages/examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li>
            <li><a href="pages/examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li>
            <li><a href="pages/examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li>
            <li><a href="pages/examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li>
            <li><a href="pages/examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li>
            <li><a href="pages/examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li>
            <li><a href="pages/examples/pace.html"><i class="fa fa-circle-o"></i> Pace Page</a></li>
          </ul>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-share"></i> <span>Multilevel</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">
            <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li>
            <li class="treeview">
              <a href="#"><i class="fa fa-circle-o"></i> Level One
                <span class="pull-right-container">
                  <i class="fa fa-angle-left pull-right"></i>
                </span>
              </a>
              <ul class="treeview-menu">
                <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li>
                <li class="treeview">
                  <a href="#"><i class="fa fa-circle-o"></i> Level Two
                    <span class="pull-right-container">
                      <i class="fa fa-angle-left pull-right"></i>
                    </span>
                  </a>
                  <ul class="treeview-menu">
                    <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li>
                    <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li>
                  </ul>
                </li>
              </ul>
            </li>
            <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li>
          </ul>
        </li>
        <li><a href="https://adminlte.io/docs"><i class="fa fa-book"></i> <span>Documentation</span></a></li>
        <li class="header">LABELS</li>
        <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li>
        <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li>
        <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li>
      </ul>
    </section>
    <!-- /.sidebar -->
  </aside>

main.html

{% include 'top.html' %}
{% include 'left.html' %}
<!-- Content Wrapper. Contains page content -->
  <div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <section class="content-header">
      <h1>
        职位分布
        <small>IT行业之分分析</small>
      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i> 职位分布</a></li>
        <li class="active">职位总览</li>
      </ol>
    </section>

    <!-- Main content -->
    <section class="content">
    <!-- Small boxes (Stat box) -->
      <!-- Main row -->
      <div class="row">
        <!-- Left col -->
        <section class="col-lg-7 connectedSortable">
          <!-- Custom tabs (Charts with tabs)-->
          <div class="nav-tabs-custom">
            <!-- Tabs within a box -->
            <ul class="nav nav-tabs pull-right">
              <li class="active"><a href="#revenue-chart" data-toggle="tab">Java语言</a></li>
              <li><a href="#sales-chart" data-toggle="tab">Python语言</a></li>
              <li class="pull-left header"><i class="fa fa-inbox"></i> 职位分布</li>
            </ul>
            <div class="tab-content no-padding">
              <!-- Morris chart - Sales -->
              <div class="chart tab-pane active" id="java-chart" style="position: relative; height: 300px;"></div>
              <div class="chart tab-pane" id="python-chart" style="position: relative; height: 300px;"></div>
            </div>
          </div>
          <!-- /.nav-tabs-custom -->

          <!-- Chat box -->
          <div class="box box-success">
            <div class="box-header">
              <i class="fa fa-comments-o"></i>

              <h3 class="box-title">开发语言薪资对比图</h3>

              <div class="box-tools pull-right" data-toggle="tooltip" title="Status">
                <div class="btn-group" data-toggle="btn-toggle">
                  <button type="button" class="btn btn-default btn-sm active"><i class="fa fa-square text-green"></i>
                  </button>
                  <button type="button" class="btn btn-default btn-sm"><i class="fa fa-square text-red"></i></button>
                </div>
              </div>
            </div>
            <div class="box-body chat">
                <div id="salary-box" style="height: 250px; width: 100%;"></div>
            </div>
            <!-- /.chat -->
          </div>
          <!-- /.box (chat box) -->

          <!-- TO DO List -->
          <div class="box box-primary">
            <div class="box-header">
              <i class="ion ion-clipboard"></i>

              <h3 class="box-title">To Do List</h3>

              <div class="box-tools pull-right">
                <ul class="pagination pagination-sm inline">
                  <li><a href="#">&laquo;</a></li>
                  <li><a href="#">1</a></li>
                  <li><a href="#">2</a></li>
                  <li><a href="#">3</a></li>
                  <li><a href="#">&raquo;</a></li>
                </ul>
              </div>
            </div>
            <!-- /.box-header -->
            <div class="box-body">
              <!-- See dist/js/pages/dashboard.js to activate the todoList plugin -->
              <ul class="todo-list">
                <li>
                  <!-- drag handle -->
                  <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <!-- checkbox -->
                  <input type="checkbox" value="">
                  <!-- todo text -->
                  <span class="text">Design a nice theme</span>
                  <!-- Emphasis label -->
                  <small class="label label-danger"><i class="fa fa-clock-o"></i> 2 mins</small>
                  <!-- General tools such as edit or delete-->
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
                <li>
                      <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <input type="checkbox" value="">
                  <span class="text">Make the theme responsive</span>
                  <small class="label label-info"><i class="fa fa-clock-o"></i> 4 hours</small>
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
                <li>
                      <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <input type="checkbox" value="">
                  <span class="text">Let theme shine like a star</span>
                  <small class="label label-warning"><i class="fa fa-clock-o"></i> 1 day</small>
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
                <li>
                      <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <input type="checkbox" value="">
                  <span class="text">Let theme shine like a star</span>
                  <small class="label label-success"><i class="fa fa-clock-o"></i> 3 days</small>
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
                <li>
                      <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <input type="checkbox" value="">
                  <span class="text">Check your messages and notifications</span>
                  <small class="label label-primary"><i class="fa fa-clock-o"></i> 1 week</small>
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
                <li>
                      <span class="handle">
                        <i class="fa fa-ellipsis-v"></i>
                        <i class="fa fa-ellipsis-v"></i>
                      </span>
                  <input type="checkbox" value="">
                  <span class="text">Let theme shine like a star</span>
                  <small class="label label-default"><i class="fa fa-clock-o"></i> 1 month</small>
                  <div class="tools">
                    <i class="fa fa-edit"></i>
                    <i class="fa fa-trash-o"></i>
                  </div>
                </li>
              </ul>
            </div>
            <!-- /.box-body -->
            <div class="box-footer clearfix no-border">
              <button type="button" class="btn btn-default pull-right"><i class="fa fa-plus"></i> Add item</button>
            </div>
          </div>
          <!-- /.box -->

          <!-- quick email widget -->
          <div class="box box-info">
            <div class="box-header">
              <i class="fa fa-envelope"></i>

              <h3 class="box-title">Quick Email</h3>
              <!-- tools box -->
              <div class="pull-right box-tools">
                <button type="button" class="btn btn-info btn-sm" data-widget="remove" data-toggle="tooltip"
                        title="Remove">
                  <i class="fa fa-times"></i></button>
              </div>
              <!-- /. tools -->
            </div>
            <div class="box-body">
              <form action="#" method="post">
                <div class="form-group">
                  <input type="email" class="form-control" name="emailto" placeholder="Email to:">
                </div>
                <div class="form-group">
                  <input type="text" class="form-control" name="subject" placeholder="Subject">
                </div>
                <div>
                  <textarea class="textarea" placeholder="Message"
                            style="width: 100%; height: 125px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea>
                </div>
              </form>
            </div>
            <div class="box-footer clearfix">
              <button type="button" class="pull-right btn btn-default" id="sendEmail">Send
                <i class="fa fa-arrow-circle-right"></i></button>
            </div>
          </div>

        </section>
        <!-- /.Left col -->
        <!-- right col (We are only adding the ID to make the widgets sortable)-->
        <section class="col-lg-5 connectedSortable">

          <!-- Map box -->
          <div class="box box-solid bg-light-blue-gradient">
            <div class="box-header">
              <!-- tools box -->
              <div class="pull-right box-tools">
                <button type="button" class="btn btn-primary btn-sm daterange pull-right" data-toggle="tooltip"
                        title="Date range">
                  <i class="fa fa-calendar"></i></button>
                <button type="button" class="btn btn-primary btn-sm pull-right" data-widget="collapse"
                        data-toggle="tooltip" title="Collapse" style="margin-right: 5px;">
                  <i class="fa fa-minus"></i></button>
              </div>
              <!-- /. tools -->

              <i class="fa fa-map-marker"></i>

              <h3 class="box-title">
                开发语言职位占比
              </h3>
            </div>
            <div class="box-body">
              <div id="jobPie" style="height: 250px; width: 100%;"></div>
            </div>
            <!-- /.box-body-->
            <div class="box-footer no-border">
              <div class="row">
                <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4">
                  <div id="sparkline-1"></div>
                  <div class="knob-label">Visitors</div>
                </div>
                <!-- ./col -->
                <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4">
                  <div id="sparkline-2"></div>
                  <div class="knob-label">Online</div>
                </div>
                <!-- ./col -->
                <div class="col-xs-4 text-center">
                  <div id="sparkline-3"></div>
                  <div class="knob-label">Exists</div>
                </div>
                <!-- ./col -->
              </div>
              <!-- /.row -->
            </div>
          </div>
          <!-- /.box -->

          <!-- solid sales graph -->
          <div class="box box-solid bg-teal-gradient">
            <div class="box-header">
              <i class="fa fa-th"></i>

              <h3 class="box-title">Sales Graph</h3>

              <div class="box-tools pull-right">
                <button type="button" class="btn bg-teal btn-sm" data-widget="collapse"><i class="fa fa-minus"></i>
                </button>
                <button type="button" class="btn bg-teal btn-sm" data-widget="remove"><i class="fa fa-times"></i>
                </button>
              </div>
            </div>
            <div class="box-body border-radius-none">
              <div class="chart" id="line-chart" style="height: 250px;"></div>
            </div>
            <!-- /.box-body -->
            <div class="box-footer no-border">
              <div class="row">
                <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4">
                  <input type="text" class="knob" data-readonly="true" value="20" data-width="60" data-height="60"
                         data-fgColor="#39CCCC">

                  <div class="knob-label">Mail-Orders</div>
                </div>
                <!-- ./col -->
                <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4">
                  <input type="text" class="knob" data-readonly="true" value="50" data-width="60" data-height="60"
                         data-fgColor="#39CCCC">

                  <div class="knob-label">Online</div>
                </div>
                <!-- ./col -->
                <div class="col-xs-4 text-center">
                  <input type="text" class="knob" data-readonly="true" value="30" data-width="60" data-height="60"
                         data-fgColor="#39CCCC">

                  <div class="knob-label">In-Store</div>
                </div>
                <!-- ./col -->
              </div>
              <!-- /.row -->
            </div>
            <!-- /.box-footer -->
          </div>
          <!-- /.box -->

          <!-- Calendar -->
          <div class="box box-solid bg-green-gradient">
            <div class="box-header">
              <i class="fa fa-calendar"></i>

              <h3 class="box-title">Calendar</h3>
              <!-- tools box -->
              <div class="pull-right box-tools">
                <!-- button with a dropdown -->
                <div class="btn-group">
                  <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown">
                    <i class="fa fa-bars"></i></button>
                  <ul class="dropdown-menu pull-right" role="menu">
                    <li><a href="#">Add new event</a></li>
                    <li><a href="#">Clear events</a></li>
                    <li class="divider"></li>
                    <li><a href="#">View calendar</a></li>
                  </ul>
                </div>
                <button type="button" class="btn btn-success btn-sm" data-widget="collapse"><i class="fa fa-minus"></i>
                </button>
                <button type="button" class="btn btn-success btn-sm" data-widget="remove"><i class="fa fa-times"></i>
                </button>
              </div>
              <!-- /. tools -->
            </div>
            <!-- /.box-header -->
            <div class="box-body no-padding">
              <!--The calendar -->
              <div id="calendar" style="width: 100%"></div>
            </div>
            <!-- /.box-body -->
            <div class="box-footer text-black">
              <div class="row">
                <div class="col-sm-6">
                  <!-- Progress bars -->
                  <div class="clearfix">
                    <span class="pull-left">Task #1</span>
                    <small class="pull-right">90%</small>
                  </div>
                  <div class="progress xs">
                    <div class="progress-bar progress-bar-green" style="width: 90%;"></div>
                  </div>

                  <div class="clearfix">
                    <span class="pull-left">Task #2</span>
                    <small class="pull-right">70%</small>
                  </div>
                  <div class="progress xs">
                    <div class="progress-bar progress-bar-green" style="width: 70%;"></div>
                  </div>
                </div>
                <!-- /.col -->
                <div class="col-sm-6">
                  <div class="clearfix">
                    <span class="pull-left">Task #3</span>
                    <small class="pull-right">60%</small>
                  </div>
                  <div class="progress xs">
                    <div class="progress-bar progress-bar-green" style="width: 60%;"></div>
                  </div>

                  <div class="clearfix">
                    <span class="pull-left">Task #4</span>
                    <small class="pull-right">40%</small>
                  </div>
                  <div class="progress xs">
                    <div class="progress-bar progress-bar-green" style="width: 40%;"></div>
                  </div>
                </div>
                <!-- /.col -->
              </div>
              <!-- /.row -->
            </div>
          </div>
          <!-- /.box -->

        </section>
        <!-- right col -->
      </div>
      <!-- /.row (main row) -->

    </section>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
{% include 'footer.html' %}
<script src="{{ url_for('static',filename='echarts/echarts.js') }}"></script>
<script src="{{ url_for('static',filename='echarts/china.js') }}"></script>
<script src="{{ url_for('static',filename='echarts/chartsdata.js') }}"></script>

login.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>登录</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.7 -->
  <link rel="stylesheet" href="static/bootstrap/dist/css/bootstrap.min.css">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="static/font-awesome/css/font-awesome.min.css">
  <!-- Ionicons -->
  <link rel="stylesheet" href="static/bower_components/Ionicons/css/ionicons.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="static/css/AdminLTE.css">

  </head>
<body class="hold-transition login-page">
<div class="login-box">
  <div class="login-logo">
    <a href="#">职位数据分析平台</a>
  </div>
  <!-- /.login-logo -->
  <div class="login-box-body">
    <p class="login-box-msg">亲,请登录:</p>

    <form action="login.do" method="post">
      <div class="form-group has-feedback">
        <input type="text" name="userName" class="form-control" placeholder="用户名" required>
        <span class="glyphicon glyphicon-user form-control-feedback"></span>
      </div>
      <div class="form-group has-feedback">
        <input type="password" name="userPwd" class="form-control" placeholder="密码" required>
        <span class="glyphicon glyphicon-lock form-control-feedback"></span>
      </div>
      <div class="row">
        <div class="col-xs-8">
          <div class="checkbox icheck">
            <label>
              <input type="checkbox"> 记住密码
            </label>
          </div>
        </div>
        <!-- /.col -->
        <div class="col-xs-4">
          <button type="submit" class="btn btn-primary btn-block btn-flat">登录</button>
        </div>
        <!-- /.col -->
      </div>
    </form>

    <div class="social-auth-links text-center">
      <p></p>
      <a href="#" class="btn btn-block btn-social btn-primary btn-flat"><i class="fa  fa-qq"></i> 使用QQ登录</a>
      <a href="#" class="btn btn-block btn-social btn-success btn-flat"><i class="fa  fa-weixin"></i> 使用微信登录</a>
    </div>
    <!-- /.social-auth-links -->

    <a href="#">忘记密码</a><br>
    <a href="register.html" class="text-center">注册新用户</a>

  </div>
  <!-- /.login-box-body -->
</div>
<!-- /.login-box -->

<!-- jQuery 3 -->
<script src="static/jquery/dist/jquery.min.js"></script>
<!-- Bootstrap 3.3.7 -->
<script src="static/bootstrap/dist/js/bootstrap.min.js"></script>
</body>
</html>

userinfo.html

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

<div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <section class="content-header">
      <h1>
        系统管理
        <small>用户信息管理</small>
      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i> 系统管理</a></li>
        <li><a href="#">系统用户</a></li>
        <li class="active">用户信息管理</li>
      </ol>
    </section>
    <!-- Main content -->
    <section class="content">
      <div class="row">
        <div class="col-xs-12">
          <div class="box">
            <div class="box-header">
              <h3 class="box-title">用户信息</h3>
            </div>
            <!-- /.box-header -->
            <div class="box-body">
                <form method="post" name="searchForm" class="form-inline">
                <div class="form-group">
                    <div class="form-group">
                    <label class="control-label" for="userName">用户名:</label>
                    <input type="text" name="userName" class="form-control" id="userName"/>
                    </div>
                    <div class="form-group">
                    <label class="control-label" for="userPwd">性别: </label>
                    <input type="text" name="userSex"  class="form-control" id="userPwd" />
                    </div>
                            <input type="hidden" name="currentPage" value="1"/>
                            <input type="hidden" name="pageSize" value="10"/>

                    <button class="btn btn-primary" type="button" οnclick="getUserData(1, 10, 'search', 0)">查询</button>

                </div>
                </form>
                <table class="table table-responsive table-bordered">
                    <caption>{{ message }}</caption>
                    <thead>
                        <tr>
                            <th style="text-align: center;width: 80px;">
                                <input type="button" value="全选"/>
                            </th>
                             <th>用户ID</th>
                             <th>用户名</th>
                             <th>用户性别</th>
                             <th>部门</th>
                             <th>操作</th>
                        </tr>
                    </thead>
                    <tbody id="dataBody">
                    </tbody>
                </table>
                    <div class="modal fade" id="modal-default">
                          <div class="modal-dialog">
                            <div class="modal-content">
                              <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                  <span aria-hidden="true">&times;</span></button>
                                <h4 class="modal-title">修改用户信息</h4>
                              </div>
                              <div class="modal-body">
                                     <form method="post" name="userForm" >
                                         <div class="form-group">
                                            <label for="userName"  class="control-label">用户名:</label>
                                           <input type="text" name="userName"  class="form-control"/>
                                         </div>
                                          <div class="form-group">
                                            <label for="userSex"  class="control-label">性别:
                                                <input type="radio" id="male" name="userSex" value="1">男&nbsp;&nbsp;
                                                <input type="radio" id="female" name="userSex" value="2">女&nbsp;&nbsp;
                                            </label>
                                          </div>
                                          <div class="form-group">
                                            <label for="userDept"  class="control-label">部门:
                                                <span id="userDept"></span>
                                                <input type="hidden" name="userDeptId" id="userDeptId" value="0"/>
                                                <div id="deptContainer">
                                                    <select id="parentDept" οnchange="getDeptList(-1, this, 2)">
                                                        <option value="-99">选择部门</option>
                                                    </select>
                                                </div>
                                            </label>
                                          </div>
                                        <input type="hidden" name="userId"/>
                                        <input type="hidden" name="currentPage" value="1"/>
                                        <input type="hidden" name="pageSize" value="10"/>
                                    </form>
                              </div>
                              <div class="modal-footer">
                                <button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button>
                                <button type="button" class="btn btn-primary" οnclick="getUserData(1, 10, 'submitUpdate', 0)">保存</button>
                              </div>
                            </div>
                            <!-- /.modal-content -->
                          </div>
                          <!-- /.modal-dialog -->
                    </div>
            </div>
            <!-- /.box-body -->
          </div>
          <!-- /.box -->
        </div>
        <!-- /.col -->
      </div>
      <!-- /.row -->
    </section>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
{% include 'footer.html' %}
<script type="text/javascript" src="{{ url_for('static',filename='js/formvalidator.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static',filename='js/userdata.js') }}"></script>

userinfo_fresh.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户管理</title>
    <script type="text/javascript" src="{{ url_for('static',filename='js/jquery-3.2.1.min.js') }}"></script>
    <script type="text/javascript" src="{{ url_for('static',filename='js/formvalidator.js') }}"></script>
</head>
<body>
<form action="/gouserinfo.do" method="post">
    用户名:<input type="text" name="userName" />
    性别:<input type="text" name="userSex" />
            <input type="submit" value="查询">
</form>

<table align="center">
    <caption>{{ message }}</caption>
    <thead>
        <tr>
            <th>
                <input type="button" value="全选"/>
                <input type="button" value="反选"/>
            </th>
             <th>用户ID</th>
             <th>用户名</th>
             <th>用户性别</th>
             <th>操作</th>
        </tr>
    </thead>
    <tbody>
        {% for user in  userList %}
        <tr>
            <td align="center"><input type="checkbox" name="userId" value="{{ user.userId }}" /></td>
            <td>{{ user.userId }}</td>
            <td>{{ user.userName }}</td>
            <td>{{ user.userSex }}</td>
            <td>
                <a href="javascript:submitRemoveUser('{{ user.userId }}')">删除</a>&nbsp;&nbsp;
                <a href="/gomodifyuser.do?userId={{ user.userId }}">修改</a>
            </td>
        </tr>
        {% endfor %}
    </tbody>
</table>
</body>
</html>

footer.html

<footer class="main-footer">
    <div class="pull-right hidden-xs">
      <b>Version</b> 2.4.0
    </div>
    <strong>Copyright &copy; 2014-2016 <a href="https://adminlte.io">Almsaeed Studio</a>.</strong> All rights
    reserved.
  </footer>

  <!-- Control Sidebar -->
  <aside class="control-sidebar control-sidebar-dark">
    <!-- Create the tabs -->
    <ul class="nav nav-tabs nav-justified control-sidebar-tabs">
      <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li>
      <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li>
    </ul>
    <!-- Tab panes -->
    <div class="tab-content">
      <!-- Home tab content -->
      <div class="tab-pane" id="control-sidebar-home-tab">
        <h3 class="control-sidebar-heading">Recent Activity</h3>
        <ul class="control-sidebar-menu">
          <li>
            <a href="javascript:void(0)">
              <i class="menu-icon fa fa-birthday-cake bg-red"></i>

              <div class="menu-info">
                <h4 class="control-sidebar-subheading">Langdon's Birthday</h4>

                <p>Will be 23 on April 24th</p>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <i class="menu-icon fa fa-user bg-yellow"></i>

              <div class="menu-info">
                <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4>

                <p>New phone +1(800)555-1234</p>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <i class="menu-icon fa fa-envelope-o bg-light-blue"></i>

              <div class="menu-info">
                <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4>

                <p>nora@example.com</p>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <i class="menu-icon fa fa-file-code-o bg-green"></i>

              <div class="menu-info">
                <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4>

                <p>Execution time 5 seconds</p>
              </div>
            </a>
          </li>
        </ul>
        <!-- /.control-sidebar-menu -->

        <h3 class="control-sidebar-heading">Tasks Progress</h3>
        <ul class="control-sidebar-menu">
          <li>
            <a href="javascript:void(0)">
              <h4 class="control-sidebar-subheading">
                Custom Template Design
                <span class="label label-danger pull-right">70%</span>
              </h4>

              <div class="progress progress-xxs">
                <div class="progress-bar progress-bar-danger" style="width: 70%"></div>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <h4 class="control-sidebar-subheading">
                Update Resume
                <span class="label label-success pull-right">95%</span>
              </h4>

              <div class="progress progress-xxs">
                <div class="progress-bar progress-bar-success" style="width: 95%"></div>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <h4 class="control-sidebar-subheading">
                Laravel Integration
                <span class="label label-warning pull-right">50%</span>
              </h4>

              <div class="progress progress-xxs">
                <div class="progress-bar progress-bar-warning" style="width: 50%"></div>
              </div>
            </a>
          </li>
          <li>
            <a href="javascript:void(0)">
              <h4 class="control-sidebar-subheading">
                Back End Framework
                <span class="label label-primary pull-right">68%</span>
              </h4>

              <div class="progress progress-xxs">
                <div class="progress-bar progress-bar-primary" style="width: 68%"></div>
              </div>
            </a>
          </li>
        </ul>
        <!-- /.control-sidebar-menu -->

      </div>
      <!-- /.tab-pane -->
      <!-- Stats tab content -->
      <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div>
      <!-- /.tab-pane -->
      <!-- Settings tab content -->
      <div class="tab-pane" id="control-sidebar-settings-tab">
        <form method="post">
          <h3 class="control-sidebar-heading">General Settings</h3>

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Report panel usage
              <input type="checkbox" class="pull-right" checked>
            </label>

            <p>
              Some information about this general settings option
            </p>
          </div>
          <!-- /.form-group -->

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Allow mail redirect
              <input type="checkbox" class="pull-right" checked>
            </label>

            <p>
              Other sets of options are available
            </p>
          </div>
          <!-- /.form-group -->

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Expose author name in posts
              <input type="checkbox" class="pull-right" checked>
            </label>

            <p>
              Allow the user to show his name in blog posts
            </p>
          </div>
          <!-- /.form-group -->

          <h3 class="control-sidebar-heading">Chat Settings</h3>

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Show me as online
              <input type="checkbox" class="pull-right" checked>
            </label>
          </div>
          <!-- /.form-group -->

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Turn off notifications
              <input type="checkbox" class="pull-right">
            </label>
          </div>
          <!-- /.form-group -->

          <div class="form-group">
            <label class="control-sidebar-subheading">
              Delete chat history
              <a href="javascript:void(0)" class="text-red pull-right"><i class="fa fa-trash-o"></i></a>
            </label>
          </div>
          <!-- /.form-group -->
        </form>
      </div>
      <!-- /.tab-pane -->
    </div>
  </aside>
  <!-- /.control-sidebar -->
  <!-- Add the sidebar's background. This div must be placed
       immediately after the control sidebar -->
  <div class="control-sidebar-bg"></div>
</div>
<!-- ./wrapper -->

<!-- jQuery 3 -->
<script src="{{ url_for('static',filename='jquery/dist/jquery.min.js') }}"></script>
<!-- jQuery UI 1.11.4 -->
<script src="{{ url_for('static',filename='jquery-ui/jquery-ui.min.js') }}"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
  $.widget.bridge('uibutton', $.ui.button);
</script>
<!-- Bootstrap 3.3.7 -->
<script src="{{ url_for('static',filename='bootstrap/dist/js/bootstrap.min.js') }}"></script>
<!-- Morris.js charts -->
<script src="{{ url_for('static',filename='raphael/raphael.min.js') }}"></script>
<script src="{{ url_for('static',filename='morris.js/morris.min.js') }}"></script>
<!-- Sparkline -->
<script src="{{ url_for('static',filename='jquery-sparkline/dist/jquery.sparkline.min.js') }}"></script>
<!-- jQuery Knob Chart -->
<script src="{{ url_for('static',filename='jquery-knob/dist/jquery.knob.min.js') }}"></script>
<!-- daterangepicker -->
<script src="{{ url_for('static',filename='moment/min/moment.min.js') }}"></script>
<script src="{{ url_for('static',filename='bootstrap-daterangepicker/daterangepicker.js') }}"></script>
<!-- datepicker -->
<script src="{{ url_for('static',filename='bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js') }}"></script>
<!-- Slimscroll -->
<script src="{{ url_for('static',filename='jquery-slimscroll/jquery.slimscroll.min.js') }}"></script>
<!-- FastClick -->
<script src="{{ url_for('static',filename='fastclick/lib/fastclick.js') }}"></script>
<!-- AdminLTE App -->
<script src="{{ url_for('static',filename='js/adminlte.min.js') }}"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<script src="{{ url_for('static',filename='js/pages/dashboard.js') }}"></script>
<!-- AdminLTE for demo purposes -->
<script src="{{ url_for('static',filename='js/demo.js') }}"></script>
</body>
</html>

jobtaskinfo.html

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

<div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <section class="content-header">
      <h1>
        系统管理
        <small>任务信息管理</small>
      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i> 采集管理</a></li>
        <li><a href="#">系统任务</a></li>
        <li class="active">任务信息管理</li>
      </ol>
    </section>
    <!-- Main content -->
    <section class="content">
      <div class="row">
        <div class="col-xs-12">
          <div class="box">
            <div class="box-header">
              <h3 class="box-title">任务信息</h3>
            </div>
            <!-- /.box-header -->
            <div class="box-body">
                <form method="post" name="searchForm" class="form-inline">
                <div class="form-group">
                    <div class="form-group">
                    <label class="control-label" for="taskTitle">任务名:</label>
                    <input type="text" name="taskTitle" class="form-control" id="taskTitle"/>
                    </div>
                    <div class="form-group">
                    <label class="control-label" for="taskURL">任务地址: </label>
                    <input type="text" name="taskURL"  class="form-control" id="taskURL" />
                    </div>
                            <input type="hidden" name="currentPage" value="1"/>
                            <input type="hidden" name="pageSize" value="10"/>

                    <button class="btn btn-primary" type="button"  οnclick="getJobTaskData(1, 10, 'search', 0)">查询</button>

                </div>
                </form>
                <table class="table table-responsive table-bordered">
                    <caption>{{ message }}</caption>
                    <thead>
                        <tr>
                            <th style="text-align: center;width: 80px;">
                                <input type="button" value="全选"/>
                            </th>
                             <th>任务ID</th>
                             <th>任务名称</th>
                             <th style="width: 300px;word-wrap: break-word;overflow: hidden;">任务URL地址</th>
                             <th>操作</th>
                        </tr>
                    </thead>
                    <tbody id="dataBody">
                    </tbody>
                </table>
                    <div class="modal fade" id="modal-default">
                          <div class="modal-dialog">
                            <div class="modal-content">
                              <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                  <span aria-hidden="true">&times;</span></button>
                                <h4 class="modal-title">修改任务信息</h4>
                              </div>
                              <div class="modal-body">
                                     <form method="post" name="taskForm">
                                         任务名称:<input type="text" name="taskTitle" />
                                         采集URL地址:  <input type="text" name="taskURL" />
                                        <input type="hidden" name="taskId"/>
                                        <input type="hidden" name="currentPage" value="1"/>
                                        <input type="hidden" name="pageSize" value="10"/>
                                    </form>
                              </div>
                              <div class="modal-footer">
                                <button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button>
                                <button type="button" class="btn btn-primary" οnclick="getJobTaskData(1, 10, 'submitUpdate', 0)">保存</button>
                              </div>
                            </div>
                            <!-- /.modal-content -->
                          </div>
                          <!-- /.modal-dialog -->
                    </div>
            </div>
            <!-- /.box-body -->
          </div>
          <!-- /.box -->
        </div>
        <!-- /.col -->
      </div>
      <!-- /.row -->
    </section>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
{% include 'footer.html' %}
<script type="text/javascript" src="{{ url_for('static',filename='js/jobtask.js') }}"></script>

程序启动入口: 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.deptcontroller import deptcontroller
from controller.goodscontroller import goodscontroller
from controller.goodstypecontroller import goodstypecontroller
from filter.rolefilter import rolefilter
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(jobtaskcontroller)
app.register_blueprint(deptcontroller)
app.register_blueprint(goodscontroller)
app.register_blueprint(goodstypecontroller)

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

@app.route('/main')  # URL路由
def main():
    return render_template('main.html')
    pass

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

'''
关于 PyCharm2018 后续版本中修改 host port 以及 Debug

本人在使用 PyCharm 时,普通教程中给出的修改 host,port 以及 debug 方法都不能在我这里体现出来,
搜索“flask 无法修改服务器端口”,“flask 无法修改 host 和 port ” 以及 “flask cannot change
 port or host ” 这样的字段半天之后,终于找到了解决方案 
修改 Debug 模式需要点击右上角运行按钮左侧,选择 Edit-Configuration 找到 FLASK_DEBUG 打上勾即可 
修改 host 以及 port 有两种方式 
1. 修改app.run()代码如下

if __name__ == '__main__'
    app.run(host='x.x.x.x',port=8000)

然后进入cmd,找到 app.py 文件所在的位置
'''

有什么不足,还请大神多多指点!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值