基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

登陆界面:

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

注册界面:

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

主界面:

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

 

用户管理界面:

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

 

修改界面:

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+ Ajax的异步文件上传(将文件上传放在一起)

 

代码实现:

app.py运行文件:

from flask import Flask, render_template,session
import config
from config_class import *
from datetime import timedelta
from filter.sessionfilter import  sessionfilter
from controller.usercontroller import usercontroller
from controller.deptcontroller import deptcontroller

app = Flask(__name__)

#1.直接定义config
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'AAAGGGGCCFDDDFFFDDDD'
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)  #设置session的保存时间。

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

app.register_blueprint(sessionfilter)   # 声明
app.register_blueprint(usercontroller)   # 声明
app.register_blueprint(deptcontroller)

@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)
 

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="index.html"><i class="fa fa-circle-o"></i> 职位分析报表</a></li>
            <li><a href="index2.html"><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="#"><i class="fa fa-circle-o"></i> 采集任务管理</a></li>
            <li><a href="#"><i class="fa fa-circle-o"></i> 职位信息管理</a></li>
            <li><a href="#"><i class="fa fa-circle-o"></i> 商品信息管理</a></li>
            <li><a href="#"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li>
          </ul>
        </li>
        <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> Morris</a></li>
            <li><a href="pages/charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li>
            <li><a href="pages/charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li>
          </ul>
        </li>
        <li class="treeview">
          <a href="#">
            <i class="fa fa-laptop"></i>
            <span>UI Elements</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> General</a></li>
            <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li>
            <li><a href="pages/UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li>
            <li><a href="pages/UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li>
            <li><a href="pages/UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li>
            <li><a href="pages/UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li>
          </ul>
        </li>
        <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' %}

{# echart用来图表化,在js包里面 #}
{#<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>#}
 

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>[email protected]</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>

index.html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>职位分析系统主页</title>
        <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='bower_components/Ionicons/css/ionicons.min.css') }}"/>
        <!-- Theme style -->
        <link rel="stylesheet"  href="{{ url_for('static',filename='css/AdminLTE.css') }}" />
        <link rel="stylesheet"  href="{{ url_for('static',filename='css/style.css') }}" />
        <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>
        <!-- Bootstrap 3.3.7 -->
        <script src="{{ url_for('static', filename='bootstrap/dist/js/bootstrap.min.js') }}"></script>
        <link rel="stylesheet"  href="{{ url_for('static',filename='bootstrapvalidator/css/bootstrapValidator.css') }}" />
    </head>
    <body style="min-width:1200px;padding: 0px;margin: 0;background-color: lavenderblush;">
        <div id="header" style="width: 100%;margin: 0px;padding: 0px;height: 40px;border: solid 0px red;background-color: greenyellow; ">
            <div style="width: 90%;border: solid 0px red;margin-left: 5%;padding: 6px;" align="left">
                <div  style="border: solid 0px red;padding: 0px;float: left"></div>
                <div  style="border: solid 0px red;padding: 0px;float: right">
                    {% if session.get('user') == None  %}
                          <a href="/login.do">登录  </a>&nbsp;&nbsp;&nbsp;&nbsp;
                          <a href="#" type="button" class="btn btn-info" data-toggle="modal" data-target="#modal-info">注册  </a>
                    {% elif session.get('user') != None %}
                        {{ session.get('user') }}
                        <a href="/logout.do">注销</a>
                    {% endif %}
                </div>
            </div>
        </div>
        <div id='main' style="width: 90%;border: solid 0px red;margin-left: 5%;" align="center">
            <div id='middle' style="min-height:800px;background-color: #0b58a2;width: 60%;float:left;border: solid 0px red;margin-left: 300px;">
                <div style="width: 100%;">
                    <div style="width: 100%;">
                        <div id="myCarousel" class="carousel slide" >
                            <!– 按钮操作区-->
                            <ol class="carousel-indicators">
                                <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
                                <li data-target="#myCarousel" data-slide-to="1"></li>
                                <li data-target="#myCarousel" data-slide-to="2"></li>
                            </ol>
                            <!– 轮播区域-->
                            <div class="carousel-inner" >
                                     <!– 轮播子项,包含图片以及文字说明-->
                                <div class="item active">
                                    <img src="{{ url_for('static',filename='img/你合格了.jpg') }}" class="img-responsive" alt="logo">
                                </div>
                                <div class="item">
                                    <img src="{{ url_for('static',filename='img/假得一批.jpg') }}" class="img-responsive"  alt="logo">
                                </div>
                                <div class="item">
                                    <img src="{{ url_for('static',filename='img/哈哈哈哈哈哈.jpg') }}" class="img-responsive"  alt="logo">
                                </div>
                            <!– 快速操作区-->
                            <a class="left carousel-control" href="#myCarousel"  data-slide="prev">
                                <span class="sr-only">prev</span>
                            </a>
                            <a class="right carousel-control" href="#myCarousel"  data-slide="next">
                                <span class="sr-only">next</span>
                            </a>
                            </div>
                        </div>
                        <script type="text/javascript">
                            var options = {
                                //设定轮播的间隔时间,单位毫秒
                                interval:2000,
                                //当鼠标悬浮时停止轮播
                                pause:hover,
                                //是否循环播放
                                wrap:true,
                                //是否响应键盘事件
                                keyboard:true
                                }
                            $("#myCarousel").carousel(options);
                        </script>
                    </div>
                </div>
            </div>
        </div>
         <div class="modal modal-default fade" id="modal-info">
          <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 start -->
                <form role="form" class="form-horizontal" method="post" name="regForm" id="regForm" enctype="multipart/form-data">
                  <div class="box-body">
                    <div class="form-group">
                      <label for="userName">用户名:</label>
                      <input type="text" class="form-control" id="userName" name="userName" placeholder="用户名" required>
                    </div>
                    <div class="form-group">
                      <label for="userPwd">密码:</label>
                      <input type="password" class="form-control" id="userPwd" name="userPwd" placeholder="密码" required>
                    </div>
                      <div class="form-group">
                      <label for="reUserPwd">重复密码:</label>
                      <input type="password" class="form-control" id="reUserPwd" name="reUserPwd" placeholder="重复密码" required>
                    </div>
                    <div class="form-group">
                      <label for="userPic">个人图像:</label>
                        <img src="" alt="图片" id="userImg" style="width: 75px;height: 100px;border: dashed 1px beige;" />
                      <input type="file" id="upload" name="upload">
                      <button type="button" class="btn btn-default" οnclick="ajaxUploadFile()">上传</button>
                        <progress id="progress"></progress>
                      <input type="hidden" id="picPath" name="picPath">
                    </div>
                      <div class="form-group">
                      <label for="userBirth">出生日期:</label>
                       <div class="input-group date">
                          <div class="input-group-addon">
                            <i class="fa fa-calendar"></i>
                          </div>
                          <input type="text" class="form-control pull-right" id="userBirth" name="userBirth">
                        </div>
                    </div>
                    <div class="form-group">
                      <label>
                        性别:
                      </label>
                        <input type="radio" value="1" name="userSex">男<input type="radio"  name="userSex" value="2">女
                    </div>
                     <div class="form-group">
                      <label for="exampleInputFile">个人简介:</label>
                       <div class="box-body pad">
                        <textarea id="userIntro" name="userIntro" rows="2" cols="60">
                        </textarea>
                        </div>
                    </div>
              </div>
            </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="submitRegist()">提交</button>
              </div>
            </div>
            <!-- /.modal-content -->
          </div>
          <!-- /.modal-dialog -->
        </div>
        <!-- /.modal -->
    </body>
</html>

 

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>

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 * from job_user u left join job_dept d on u.user_deptid=d.dept_id where user_id=%s"
            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 " \
                  "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
 

deptdao.py:

from .basedao import BaseDao

class DeptDao(BaseDao):
    def findDeptListByParentId(self, parentId):
        try:
            params = []
            sql = "select * from job_dept where 1=1 "
            if parentId ==0:
                sql += 'and dept_parentid is null'
            else:
                sql += 'and dept_parentid=%s'
                params.append(parentId)
                pass

            self.getConnection()
            self.execute(sql, params)
            self.commit()
            return self.fetch()
        except Exception as e:
            print(e)
        finally:
            self.close()
            pass
        pass
    pass
 

userservice.py:

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

class UserService:

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

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

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

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

    def findUserByUserId(self, userId):
        userDao = UserDao()
        result = userDao.findUserByUserId(userId)
        user = None
        if result:
            user = User()
            user.userId = result[0][0]
            user.userName = result[0][1]
            user.userSex = result[0][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
 

deptservice.py:

from dao.deptdao import DeptDao

class DeptService():
    def findDeptListByParentId(self,parentId):
        deptDao = DeptDao()
        return deptDao.findDeptListByParentId(parentId)
        pass
    pass
 

usercontroller.py:

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

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

@usercontroller.route("/login.do", methods=['POST', 'GET'])
def login():
    userName = request.form.get('userName')  # 表单提交的数据使用request.form[]
    userPwd = request.form.get('userPwd')
    result = userService.findUserByUserName(userName) #  ä¸šåŠ¡é€»è¾‘层 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]
        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():
    #先clear清除session,再删除cookie信息,不然得清两次session
    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'])
@sessionFilter
def goAjaxUserInfo():
    return render_template("systeminfo/userinfo.html")
    pass

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

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

    currentPage = int(userDict.get('currentPage'))
    pageSize = int(userDict.get('pageSize'))
    opr = userDict.get('opr')
    userId = int(userDict.get('userId'))
    user.userId = userId
    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():
    #ajax异步上传文件
    # 后缀需要检查的
    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目录(js里面)
        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
 

deptcontroller.py:

from flask import Flask, render_template, request, session, Blueprint
from service.deptservice import DeptService
import json

deptcontroller = Blueprint('deptcontroller',  __name__)

deptService = DeptService()
@deptcontroller.route('/getdeptlist.do')
def getDeptList():
    parentId = request.args.get('parentId')
    result = deptService.findDeptListByParentId(int(parentId))
    return json.dumps({'code':1, 'data':result})
    pass
 

 

user.py:

class User():
    def __init__(self):
        self.__userId = None
        self.__userName = None
        self.__userPwd = None
        self.__userSex = None
        self.__userPic = None
        self.__userBirth = None
        self.__userIntro = None
        self.__userDeptId = None
        self.__userDeptName = None
        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
    pass
 

sessionfilter.py--------判断登陆用户是否存在,以及相应的处理:

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

sessionfilter = Blueprint('sessionfilter', __name__)

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

 

js/userdata.js--------Ajax技术实现前后端分离,在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)
    }
)
 

 

js/userregist.js------内部含有富文本编译器,属于Ajax的异步文件上传:

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

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

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

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

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

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

 

config.py自定义配置文件,在app.py中引入:

'''

自定义配置文件

'''

DEBUG = True

SECRET_KEY = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

PAGE_SIZE = 10

SERVER_ADDR = '10.0.14.57'

SERVER_PORT = 80