运行界面(话不多说先上图)

运行之后的index界面,有登陆、注册功能

登陆界面,输入数据库中用户名、密码不为空且密码是加密的数据,进入main界面

注册界面,用的bootstrop的弹窗,用户名和密码不能为空,可传富文本与图片和日期,向数据库中添加新用户(即数据增加)

main界面,登入之后的样子,可点击系统功能管理下的用户管理,进行删除、修改、查询

用户管理界面,可进行删、改、查操作,并具有分页,部门属性是三级联查(注:性别查询用1和2代表男和女)

修改界面,用的bootstrop的弹窗,可进行三级联查

代码实现

首先,在pycharm工具中新建flask项目,然后添加相应的模板(前端+样式),进行配置,最后实现前后端连接。

其中,因为套用了模板的缘故,将模板原先的index.html拆分成top.html、left.html、main.html、footer.html,并新建一个新的index.html,一个login.html登陆文件,一个具有增删改查的用户信息,配置文件config.py,在运行文件app.py中调用配置文件和相关数据的声明,dao层直接使用(除userdao.py外),service层对应dao层方法,controller层连接前后端,static引入样式,由于用了Ajax技术,所以添加了几个js,下面详细说明。

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

'''
自定义配置文件
'''
DEBUG = True
SECRET_KEY = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
PAGE_SIZE = 10SERVER_ADDR = '10.0.14.204'
SERVER_PORT = 80

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 deptcontrollerapp = 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')passif __name__ == '__main__':app.run(host=app.config['SERVER_ADDR'], port=app.config['SERVER_PORT'], debug=True)#调用的config.py文件里的内容

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/skinsfolder 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 thepage 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--------单个会出错,需要连在一起,主要用main.html,和在left.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 rightsreserved.</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 placedimmediately 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" onclick="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" onclick="submitRegist()">提交</button></div></div><!-- /.modal-content --></div><!-- /.modal-dialog --></div><!-- /.modal --></body>
</html>
<script src="{{ url_for('static', filename='ckeditor/ckeditor.js') }}"></script>
<script src="{{ url_for('static', filename='bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js')}}"></script>
<script src="{{ url_for('static', filename='bootstrapvalidator/js/bootstrapValidator.js')}}"></script><script type="text/javascript">$(function () {// Replace the <textarea id="editor1"> with a CKEditor// instance, using default configuration.userEditor = CKEDITOR.replace('userIntro',{filebrowserUploadUrl : '/upload.do?Type=File',filebrowserImageUploadUrl : '/upload.do?Type=Image',filebrowserFlashUploadUrl : '/upload.do?Type=Flash'});})//Date picker$('#userBirth').datepicker({language: 'zh-CN',//设置语言format: "yyyy-mm-dd",//设置格式autoclose: true,//选中自动关闭})
</script>
<script src="{{ url_for('static', filename='js/userregist.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>

userdao.py-------用户信息数据的增删改查sql语句

from .basedao import BaseDaoclass 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 resultpassdef 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)passif user.userPic:sql += ",user_pic"values += ",%s"params.append(user.userPic)passif user.userIntro:sql += ",user_intro"values += ",%s"params.append(user.userIntro)passif user.userBirth:sql += ",user_birth"values += ",DATE_FORMAT(%s,'%%Y-%%m-%%d')"params.append(user.userBirth)passsql +=")" + values + ")"self.getConnection()result = self.execute(sql, params)self.commit() # 执行了sql语句之后要commitreturn resultexcept Exception as e:print(e)finally:self.close()passpassdef findUserList(self, user):try:params = []# sql语句和params就需要是动态sql = "select * from job_user where 1=1 " #  where 1=1是为了便于增加andif user.userName:sql += " and user_name like %s "  # 模糊查询params.append('%'+user.userName + '%')passif user.userSex:sql += " and user_sex=%s"params.append(user.userSex)passself.getConnection()self.execute(sql, params)result = self.fetch()finally:self.close()return resultpassdef removeUser(self, userId):try:sql = "delete from job_user where user_id=%s"self.getConnection()result = self.execute(sql, (userId, ))self.commit()  # 执行了sql语句之后要commitreturn resultfinally:self.close()passpassdef 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 resultpassdef 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语句之后要commitreturn resultexcept Exception as e:print(e)finally:self.close()passpassdef 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是为了便于增加andif user.userName:sql += " and user_name like %s "  # 模糊查询params.append('%' + user.userName + '%')passif user.userSex:sql += " and user_sex=%s"params.append(user.userSex)passstartRow = (currentPage - 1)*pageSizesql += "limit %s, %s"params.append(startRow)params.append(pageSize)self.getConnection()self.execute(sql, params)result = self.fetch()finally:self.close()return resultpassdef 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是为了便于增加andif user.userName:sql += " and user_name like %s "  # 模糊查询params.append('%' + user.userName + '%')passif user.userSex:sql += " and user_sex=%s"params.append(user.userSex)passself.getConnection()self.execute(sql, params)result = self.fetchOne()return resultpasspass

deptdao.py-------部门数据的查询sql语句

from .basedao import BaseDaoclass 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)passself.getConnection()self.execute(sql, params)self.commit()return self.fetch()except Exception as e:print(e)finally:self.close()passpasspass

userservice.py-------定义方法(与dao层一致)

from dao.userdao import UserDao
from entity.user import Userclass UserService:def findUserByUserName(self, userName):userDao = UserDao()return userDao.findUserByUserName(userName)passdef createUser(self, user):userDao = UserDao()return userDao.createUser(user)passdef 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)passreturn userlistpassdef removeUser(self, userId):userDao = UserDao()return userDao.removeUser(userId)passdef findUserByUserId(self, userId):userDao = UserDao()result = userDao.findUserByUserId(userId)user = Noneif 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]passreturn userpass# 修改用户信息def updateUser(self, user):userDao = UserDao()return userDao.updateUser(user)passdef findPageUserList(self, user, pageSize, currentPage):userDao = UserDao()return userDao.findPageUserList(user, pageSize, currentPage)passdef countUsers(self, user):userDao = UserDao()return userDao.countUsers(user)[0]passpass

deptservice.py-------定义方法(与dao层一致)

from dao.deptdao import DeptDaoclass DeptService():def findDeptListByParentId(self,parentId):deptDao = DeptDao()return deptDao.findDeptListByParentId(parentId)passpass

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 osusercontroller = 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 modelprint(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]= userItemprint(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 resppasselif result and  result[2] != userPwd:return render_template('login.html', message='用户名或密码错误')passreturn render_template('login.html')pass@usercontroller.route('/logout.do', methods=['POST', 'GET'])
def logout():#先clear清除session,再删除cookie信息,不然得清两次sessionsession.clear()print('==========', session.get('user'))resp = Response(render_template('login.html'))resp.delete_cookie('userName')resp.delete_cookie('userPwd')return resppass@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 = userNameuser.userSex = userSexuserList = 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 = userNameuser.userSex = userSexresult = 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 = userNameuser.userSex = userSexuser.userId = userIdresult = 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}passelse:dicts = {'code':0}passreturn 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 = userIduser.userDeptId = int(userDict.get('userDeptId'))updateResult = 0if opr == 'del':updateResult = userService.removeUser(userId)passelif opr == 'update':tUser = userService.findUserByUserId(userId)tData['userId'] = tUser.userIdtData['userName'] = tUser.userNametData['userSex'] = tUser.userSextData['userDeptId'] = tUser.userDeptIdtData['userDeptName'] = tUser.userDeptNamereturnData = {'code': 1, 'userData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}return json.dumps(returnData)elif opr == 'submitUpdate':updateResult = userService.updateUser(user)passresult = userService.findPageUserList(user, pageSize, currentPage)counts = userService.countUsers(user)totalPage = 0if(counts%pageSize == 0):totalPage = counts//pageSizeelse:totalPage = counts // pageSize + 1passreturnData = {'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': ""})passreturn 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 jsondeptcontroller = 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--------封装用户实体类

# 封装数据类 VO:value object  entity 类
class User():def __init__(self):self.__userId = Noneself.__userName = Noneself.__userPwd = Noneself.__userSex = Noneself.__userPic = Noneself.__userBirth = Noneself.__userIntro = Noneself.__userDeptId = Noneself.__userDeptName = Nonepass@propertydef userId(self):return self.__userIdpass@userId.setterdef userId(self, userId):self.__userId = userIdpass@propertydef userName(self):return self.__userNamepass@userName.setterdef userName(self, userName):self.__userName = userNamepass@propertydef userPwd(self):return self.__userPwdpass@userPwd.setterdef userPwd(self, userPwd):self.__userPwd = userPwdpass@propertydef userSex(self):return self.__userSexpass@userSex.setterdef userSex(self, userSex):self.__userSex = userSexpass@propertydef userPic(self):return self.__userPicpass@userPic.setterdef userPic(self, userPic):self.__userPic = userPicpass@propertydef userBirth(self):return self.__userBirthpass@userBirth.setterdef userBirth(self, userBirth):self.__userBirth = userBirthpass@propertydef userIntro(self):return self.__userIntropass@userIntro.setterdef userIntro(self, userIntro):self.__userIntro = userIntropass@propertydef userDeptId(self):return self.__userDeptIdpass@userDeptId.setterdef userDeptId(self,userDeptId):self.__userDeptId =userDeptIdpass@propertydef userDeptName(self):return self.__userDeptNamepass@userDeptName.setterdef userDeptName(self, userDeptName):self.__userDeptName = userDeptNamepasspass

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

from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonifysessionfilter = Blueprint('sessionfilter', __name__)def sessionFilter(func):def inner(*args, **kw):user = session.get('user')if not user:return render_template("login.html")passreturn func(*args, **kw)passreturn innerpass

js/userdata.js--------Ajax技术实现前后端分离,在js中进行数据处理

function getUserData(currentPage, pageSize, opr, userId) {var userName =  document.searchForm.userName.valuevar userSex = document.searchForm.userSex.valuevar userDeptId = 0if(opr == 'del'){if(!confirm('确定要删除吗?')){return false}}else if(opr == 'submitUpdate'){userName = document.userForm.userName.valueuserSex = document.userForm.userSex.valueuserId = document.userForm.userId.valueuserDeptId = document.userForm.userDeptId.valuecurrentPage = document.userForm.currentPage.valuepageSize = document.userForm.pageSize.value}$.ajax({type: 'post',                            // 传数据的方式url: '/ajaxuserinfo.do',dataType: 'json',                        // xml、json、script、htmldata: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.currentPagedocument.searchForm.pageSize.value=data.pageSizeif( 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.userNameif(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.userDeptIddocument.userForm.currentPage.value = data.currentPagedocument.userForm.pageSize.value = data.pageSize$('#modal-default').modal()getDeptList(0, null, 1)}}});
}
function getDeptList(parentId, obj, grade){if(parentId == -1){parentId = obj.valuedocument.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-TypeprocessData: 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、htmldata: 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: '密码必须由字符组成'}}},}});
});

MySQL数据库的创建及数据


在数据库中运行下面这段代码可直接生成这个表及数据。

-- MySQL dump 10.13  Distrib 5.7.17, for Win64 (x86_64)
--
-- Host: 127.0.0.1    Database: db_job_data
-- ------------------------------------------------------
-- Server version   5.7.22/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;--
-- Table structure for table `job_user`
--DROP TABLE IF EXISTS `job_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `job_user` (`USER_ID` int(11) NOT NULL AUTO_INCREMENT,`USER_NAME` varchar(32) NOT NULL,`USER_PWD` varchar(512) NOT NULL,`USER_AGE` int(11) DEFAULT NULL,`USER_SEX` int(11) DEFAULT NULL,`USER_QQ` varchar(512) DEFAULT NULL,`USER_CELLPHONE` varchar(512) DEFAULT NULL,`USER_MONEY` float DEFAULT NULL,`USER_STATUS` int(11) DEFAULT '1',`USER_PIC` varchar(100) DEFAULT NULL,`USER_INTRO` longtext,`USER_BIRTH` datetime DEFAULT NULL,`USER_DEPTID` int(11) DEFAULT NULL,PRIMARY KEY (`USER_ID`),UNIQUE KEY `USER_NAME_UNIQUE` (`USER_NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=3586 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `job_user`
--LOCK TABLES `job_user` WRITE;
/*!40000 ALTER TABLE `job_user` DISABLE KEYS */;
INSERT INTO `job_user` VALUES (3554,'afscwef','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,7),(3557,'egwfw','e10adc3949ba59abbe56e057f20f883e',NULL,2,NULL,NULL,NULL,1,NULL,NULL,NULL,3),(3558,'edbtrf','e10adc3949ba59abbe56e057f20f883e',NULL,2,NULL,NULL,NULL,1,NULL,NULL,NULL,5),(3559,'rthcwfe','e10adc3949ba59abbe56e057f20f883e',NULL,2,NULL,NULL,NULL,1,NULL,NULL,NULL,4),(3564,'kaasdjh','e10adc3949ba59abbe56e057f20f883e',18,1,'12124578@qq.com','12345789124',NULL,1,NULL,NULL,NULL,3),(3566,'axewfcw','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3567,'brtge','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3568,'wefw','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3569,'erfe','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3570,'fdgdfg','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3571,'dfg','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3572,'asdjgakjsd','e10adc3949ba59abbe56e057f20f883e',21,2,'32013834@qq.com','18331620892',NULL,1,NULL,NULL,'2019-06-04 00:00:00',NULL),(3573,'lienyi','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL),(3574,'ASD123','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,'                        ',NULL,NULL),(3576,'bnjk','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,'                        ','2019-10-22 00:00:00',NULL),(3577,'qwerty','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,'2019-10-18 00:00:00',NULL),(3578,'qwer1','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,'2019-10-18 00:00:00',NULL),(3579,'asdf4','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,'2019-10-17 00:00:00',NULL),(3580,'asdf8','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,'2019-10-26 00:00:00',NULL),(3581,'zxcv1','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,'2019-10-05 00:00:00',NULL),(3582,'lint123','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,'\\static\\uploads\\Capture001.png',NULL,'2019-10-13 00:00:00',NULL),(3583,'asdjgak5546','e10adc3949ba59abbe56e057f20f883e',NULL,NULL,NULL,NULL,NULL,1,'\\static\\uploads\\Capture001.png','<p>32156423<img alt=\"\" src=\"\\static\\uploads\\Capture001.png\" style=\"height:1080px; width:1920px\" /></p>\n','2019-10-14 00:00:00',NULL),(3584,'line12','e10adc3949ba59abbe56e057f20f883e',NULL,2,NULL,NULL,NULL,1,'\\static\\uploads\\Capture001.png','<p>asd</p>\n','2019-10-15 00:00:00',NULL),(3585,'zhaoliu','e10adc3949ba59abbe56e057f20f883e',NULL,1,NULL,NULL,NULL,1,'\\static\\uploads\\Capture001.png','<p><img alt=\"\" src=\"\\static\\uploads\\Capture001.png\" style=\"height:1080px; width:1920px\" /></p>\n','2019-10-06 00:00:00',NULL);
/*!40000 ALTER TABLE `job_user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2019-10-20 16:17:59

以上,就是基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传的一切。
其他样式以及所有的文件都在下面这个地址。https://download.csdn.net/download/weixin_44423698/11888619

基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传相关推荐

  1. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条

    源码支持在idea.eclipse.myeclipse运行,数据库采用MySQL数据库,项目采用mvc设计模式开发,页面采用jsp+html+css+js完成. servlet+javabean+jd ...

  2. 基于Python Flask框架的共享自习室预约系统的设计与实现-计算机毕业设计源码+LW文档

    1.1选题背景 信息技术的发展改变了我们的生活方式,许多行业的管理模式发生了根本性改变,特别是零售业受到电子商务强烈的冲击,越来越多的人参与到网购中.许多传统行业逐渐凋零,蓬勃发展的信息技术带来了大量 ...

  3. nodejs ajax进度条,Ajax异步文件上传与NodeJS express服务端处理的示例分析

    Ajax异步文件上传与NodeJS express服务端处理的示例分析 发布时间:2021-07-24 11:17:21 来源:亿速云 阅读:79 作者:小新 这篇文章主要介绍Ajax异步文件上传与N ...

  4. python对excel增删改查语句_利用python模拟sql语句对员工表格进行增删改查

    本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 具体需求: 员工信息表程序,实现增删改查操作: 可进行模糊查询, ...

  5. ajax 解决csrf的3种方法,input标签的文件上传

    ajax 解决csrf的3种方法,input标签的文件上传 参考文章: (1)ajax 解决csrf的3种方法,input标签的文件上传 (2)https://www.cnblogs.com/gyh0 ...

  6. python对excel增删改查_利用python模拟sql语句对员工表格进行增删改查

    本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 具体需求: 员工信息表程序,实现增删改查操作: 可进行模糊查询, ...

  7. ajax异步文件上传和进度条

    一.ajax异步文件上传 之前有说过在form表单内的文件上传,但是会刷新页面,下面就来实现不刷新页面的异步文件上传 <div class="uploding_div"> ...

  8. python操作Oracle、PostgreSQL,MySql数据库增删改查

    python操作Oracle.PostgreSQL,MySql数据库增删改查,工作中可运行案例,直接上代码,供大家参考. # _*_ coding:UTF-8 _*_#import ServerCon ...

  9. django调用python脚本返回_Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境...

    单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的settin ...

最新文章

  1. mysql优化 top_Top 20+ MySQL Best Practices【sql优化】
  2. 70个python毕设项目_10 个最值得 Python 新人练手的有趣项目
  3. Spring之Bean的配置(二)
  4. Spring Security 中取得 RememberMe 的 cookie 值
  5. spring boot 跨域请求_SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition...
  6. columns列:Rows 工作表上所有的行
  7. sql server 外键_什么是SQL Server中的外键
  8. 爬虫入门之绘图matplotlib与词云(七)
  9. mdpi ldpi hdpi的区别
  10. 网站跨站点脚本,Sql注入等攻击的处理
  11. 大话RAC介质恢复---联机日志损坏
  12. linux---任务分配(PBS)
  13. mysql/hive求实际活动时间
  14. Meta标签中 http-equiv属性详解
  15. anki怎么设置学习计划_Anki:用这套记忆卡片,学习一切你背不下来的知识 #iOS #Android #PC...
  16. 微型计算机主要应用于哪些领域,第一代计算机的主要应用领域是什么?
  17. Error during export:Export job failed !
  18. 多线程(一)线程和进程的区别
  19. 量化研究 | CTA择时出场策略指南大全
  20. 基于vue编写的2048小游戏

热门文章

  1. 汽车理论matlab编程题,汽车理论1.3及2.7matlab编程答案.doc
  2. typora画流程图、时序图(顺序图)、甘特图
  3. seo之我们网站的用户都是哪些人
  4. GBase 8s SQLCODE
  5. 金武士ups电源故障情况类型分析及维修
  6. .NET ZXING 生成带logo的二维码和普通二维码及条型码
  7. CTF -bugku-misc(持续更新直到全部刷完)
  8. 轴向柱塞泵体加工生产线专机及主要设备多头钻床及攻丝机床液压系统设计(论文 CAD图纸 液压系统图 工序卡)
  9. vue2.x使用jodit富文本编辑器,并配置自定义字体和中文
  10. 中科院声学所ZJ-3型压电测试仪