赞
踩
MVC是一种架构设计模式,是一种设计理念。是为了达到分层设计的目的,从而使代码解耦,便于维护和代码的复用。MVC是3个单词的缩写,全称:Model-View-Controller(模型-视图-控制器)。
1、Model
模型层,可以简单理解就是数据层,用于提供数据。在项目中,(简单理解)一般把数据访问和操作,比如将对象关系映射这样的代码作为Model层,也就是对数据库的操作这一些列的代码作为Model层。比如代码中我们会写DAO和DTO类型的代码,那这个DAO和DTO我们可以理解为是属于Model层的代码。
2、View
视图层,就是UI界面,用于跟用户进行交互。一般所有的JSP、Html等页面就是View层。
3、Controller
控制层,Controller层的功能就是将Model和View层进行关联。比如View主要是显示数据的,但是数据又需要Model去访问,这样的话,View会先告诉Controller,然后Controller再告诉Model,Model请求完数据之后,再告诉View。这样View就可以显示数据了。
实现效果:
代码 及结构:
话不多说上代码:
controller
——usercontroller.py
from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify,redirect import hashlib from service.userservice import UserService from entity.user import User import json from filter.sessionfilter import sessionFilter import os from filter.rolefilter import roleFilter usercontroller = Blueprint('usercontroller', __name__) userService = UserService() @usercontroller.route("/login.do", methods=['POST', 'GET']) def login(): userName = request.form.get('userName') # 表单提交的数据使用request.form[] userPwd = request.form.get('userPwd') result = userService.findUserByUserName(userName) # 业务逻辑层 dao:database access object model print(result) if result and result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest(): userItem = {} userItem['userId'] = result[0][0] userItem['userName'] = result[0][1] userItem['userPic'] = result[0][9] userItem['userRole'] = result[0][13] session['user'] = userItem # session是http协议的状态跟踪技术,http协议是tcp短连接 # sessionDict[sessionid][user]= userItem print(hashlib.md5('123456'.encode(encoding='utf-8')).hexdigest()) # 登录成功,则保存Cookies信息 resp = Response(render_template('main.html', messasge='登录成功')) resp.set_cookie('userName', userName, max_age=7*24*3600) resp.set_cookie('userPwd', userPwd, max_age=7*24*3600) return resp pass elif result and result[2] != userPwd: return render_template('login.html', message='用户名或密码错误') pass return render_template('login.html') pass @usercontroller.route('/logout.do', methods=['POST', 'GET']) def logout(): session.clear() print('==========', session.get('user')) resp = Response(render_template('login.html')) resp.delete_cookie('userName') resp.delete_cookie('userPwd') return resp pass @usercontroller.route('/regist.do', methods=['POST', 'GET']) def regist(): userData = request.get_data() userDict = json.loads(userData) user = User() user.userName = userDict.get('userName') # 表单提交的数据使用request.form[] user.userPwd = hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest() user.userPic = userDict.get('userPic') user.userBirth = userDict.get('userBirth') user.userSex = userDict.get('userSex') user.userIntro = userDict.get('userIntro') result = userService.createUser(user) return json.dumps({'result':result}) pass # 查询用户,并且显示 @usercontroller.route('/gouserinfo.do', methods=['POST', 'GET']) def goUserInfo(): userName = request.form.get('userName') userSex = request.form.get('userSex') user = User() user.userName = userName user.userSex = userSex userList = userService.findUserList(user) return render_template('systeminfo/userinfo.html', userList = userList, user=user) pass # 删除用户,并且显示 @usercontroller.route('/removeruser.do', methods=['POST', 'GET']) def goRemoveUser(): userId = request.args.get('userId') # 超链接http默认是get请求 userName = request.form.get('userName') userSex = request.form.get('userSex') # user = User() user.userName = userName user.userSex = userSex result = userService.removeUser(userId) userList = userService.findUserList(user) return render_template('systeminfo/userinfo.html', userList = userList, message='删除成功' if result >0 else '删除失败') pass @usercontroller.route('/gomodifyuser.do', methods=['POST', 'GET']) def goModifyUser(): userId = request.args.get('userId') user = userService.findUserByUserId(userId) return render_template('systeminfo/modifyuser.html', user=user) pass @usercontroller.route('/gomodifysubmit.do', methods=['POST', 'GET']) def goSubmitModifyUser(): userId = request.form.get('userId') userName = request.form.get('userName') userSex = request.form.get('userSex') user = User() user.userName = userName user.userSex = userSex user.userId = userId result = userService.updateUser(user) userList = userService.findUserList(user) return render_template('systeminfo/userinfo.html', userList=userList, message='修改成功' if result > 0 else '修改失败') pass @usercontroller.route('/checkusername.do', methods=['POST', 'GET']) def checkUserName(): userData = request.get_data() userDict = json.loads(userData) user = userService.findUserByUserName(userDict.get('userName')) dicts = {} if user: dicts = {'code':1} pass else: dicts = {'code':0} pass return json.dumps(dicts) pass @usercontroller.route('/goajaxuserinfo.do', methods=['POST', 'GET'], endpoint='goAjaxUserInfo') @sessionFilter @roleFilter def goAjaxUserInfo(): return render_template("systeminfo/userinfo.html") pass @usercontroller.route('/ajaxuserinfo.do', methods=['POST', 'GET'], endpoint='getUserInfo') @sessionFilter @roleFilter def getUserInfo(): userData = request.get_data() userDict = json.loads(userData) tData = {} user = User() user.userName = userDict.get('userName') user.userSex = userDict.get('userSex') currentPage = int(userDict.get('currentPage')) pageSize = int(userDict.get('pageSize')) opr = userDict.get('opr') userId = int(userDict.get('userId')) user.userId = userId user.userDeptId = int(userDict.get('userDeptId')) updateResult = 0 if opr == 'del': updateResult = userService.removeUser(userId) pass elif opr == 'update': tUser = userService.findUserByUserId(userId) tData['userId'] = tUser.userId tData['userName'] = tUser.userName tData['userSex'] = tUser.userSex tData['userDeptId'] = tUser.userDeptId tData['userDeptName'] = tUser.userDeptName returnData = {'code': 1, 'userData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'} return json.dumps(returnData) elif opr == 'submitUpdate': updateResult = userService.updateUser(user) pass result = userService.findPageUserList(user, pageSize, currentPage) counts = userService.countUsers(user) totalPage = 0 if(counts%pageSize == 0): totalPage = counts//pageSize else: totalPage = counts // pageSize + 1 pass returnData = {'code':1, 'userData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts} return json.dumps(returnData) pass @usercontroller.route('/upload.do', methods=['POST', 'GET'], strict_slashes=False) def uploadFile(): # 后缀需要检查的 file = request.files.get('upload') if file: try: file.save(os.path.dirname(__file__) + os.sep + '..' + os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.filename) # 保存文件到upload目录 except Exception as e: return json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}) pass return json.dumps({'uploaded': 1, 'fileName':file.filename, 'url': os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.filename}) else: return json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}) pass
——jobcontroller.py
from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify import hashlib from service.jobtaskservice import JobTaskService from entity.jobtask import JobTask import json from filter.sessionfilter import sessionFilter jobtaskcontroller = Blueprint('jobtaskcontroller', __name__) jobTaskService = JobTaskService() @jobtaskcontroller.route('/goajaxjobtaskinfo.do', methods=['POST', 'GET']) @sessionFilter def goJobTaskInfo(): return render_template("jobinfo/jobtaskinfo.html") pass @jobtaskcontroller.route('/ajaxjobtaskinfo.do', methods=['POST', 'GET']) def getJobTaskInfo(): jobTaskData = request.get_data() jobTaskDict = json.loads(jobTaskData) tData = {} jobTask = JobTask() jobTask.taskTitle = jobTaskDict.get('taskTitle') jobTask.taskURL = jobTaskDict.get('taskURL') currentPage = int(jobTaskDict.get('currentPage')) pageSize = int(jobTaskDict.get('pageSize')) opr = jobTaskDict.get('opr') taskId = int(jobTaskDict.get('taskId')) jobTask.taskId = taskId updateResult = 0 if opr == 'del': updateResult = jobTaskService.removeJobTask(taskId) pass elif opr == 'update': tTask = jobTaskService.findJobTaskByJobTaskId(taskId) tData['taskId'] = tTask.taskId tData['taskTitle'] = tTask.taskTitle tData['taskURL'] = tTask.taskURL returnData = {'code': 1, 'jobTaskData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'} return json.dumps(returnData) elif opr == 'submitUpdate': updateResult = jobTaskService.updateJobTask(jobTask) pass result = jobTaskService.findPageJobTaskList(jobTask, pageSize, currentPage) counts = jobTaskService.countJobTasks(jobTask) totalPage = 0 if(counts%pageSize == 0): totalPage = counts//pageSize else: totalPage = counts // pageSize + 1 pass returnData = {'code':1, 'jobTaskData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts} return json.dumps(returnData) pass @jobtaskcontroller.route('/ajaxjobsalary.do', methods=['POST', 'GET']) def getJobSalary(): result = jobTaskService.findJobMeanSalary() returnData = {'code':1, 'salary':result} r = json.dumps(returnData) return json.dumps(returnData) pass
dao
——pymysql.json
{"host":"127.0.0.1", "user":"root","password":"root", "database":"db_job_data", "port":3306, "charset":"utf8"}
——basedao.py
import pymysql import json import logging import os class BaseDao(): # DAO: database access object def __init__(self, configFile='pymysql.json'): self.__connection = None self.__cursor = None self.__config = json.load(open(os.path.dirname(__file__) + os.sep + configFile, 'r')) # 通过json配置获得数据的连接配置信息 print(self.__config) pass # 获取数据库连接的方法 def getConnection(self): # 当有连接对象时,直接返回连接对象 if self.__connection: return self.__connection # 否则通过建立新的连接对象 try: self.__connection = pymysql.connect(**self.__config) return self.__connection except pymysql.MySQLError as e: print("Exception:" + str(e)) pass pass # 用于执行sql语句的通用方法 # sql注入 def execute(self, sql, params=None): try: self.__cursor = self.getConnection().cursor() # result返回sql语句影响到的条数 if params: # 带参数sql语句 result = self.__cursor.execute(sql, params) else: # 不带参数sql语句 result = self.__cursor.execute(sql) return result except (pymysql.MySQLError, pymysql.DatabaseError, Exception) as e: print("出现数据库访问异常:" + str(e)) self.rollback() pass finally: pass pass def fetch(self): if self.__cursor: return self.__cursor.fetchall() pass def fetchOne(self): if self.__cursor: return self.__cursor.fetchone() pass def commit(self): if self.__connection: self.__connection.commit() pass def rollback(self): if self.__connection: self.__connection.rollback() pass # 返回最后的自增主键 def getLastRowId(self): if self.__cursor: return self.__cursor.lastrowid pass def close(self): if self.__cursor: self.__cursor.close() if self.__connection: self.__connection.close() pass pass
——userdao.py
from .basedao import BaseDao class UserDao(BaseDao): def findUserByUserName(self, userName): try: sql = "select * from job_user where user_name=%s" self.getConnection() self.execute(sql, (userName,)) result = self.fetch() finally: self.close() return result pass def createUser(self, user): try: params = [user.userName, user.userPwd] sql = "insert into job_user (user_name, user_pwd" values = " values (%s, %s" if user.userSex: sql += ",user_sex" values += ",%s" params.append(user.userSex) pass if user.userPic: sql += ",user_pic" values += ",%s" params.append(user.userPic) pass if user.userIntro: sql += ",user_intro" values += ",%s" params.append(user.userIntro) pass if user.userBirth: sql += ",user_birth" values += ",DATE_FORMAT(%s,'%%Y-%%m-%%d')" params.append(user.userBirth) pass sql +=")" + values + ")" self.getConnection() result = self.execute(sql, params) self.commit() # 执行了sql语句之后要commit return result except Exception as e: print(e) finally: self.close() pass pass def findUserList(self, user): try: params = [] # sql语句和params就需要是动态 sql = "select * from job_user where 1=1 " # where 1=1是为了便于增加and if user.userName: sql += " and user_name like %s " # 模糊查询 params.append('%'+user.userName + '%') pass if user.userSex: sql += " and user_sex=%s" params.append(user.userSex) pass self.getConnection() self.execute(sql, params) result = self.fetch() finally: self.close() return result pass def removeUser(self, userId): try: sql = "delete from job_user where user_id=%s" self.getConnection() result = self.execute(sql, (userId, )) self.commit() # 执行了sql语句之后要commit return result finally: self.close() pass pass def findUserByUserId(self, userId): try: sql = "select USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \ "USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \ "from job_user left join job_dept on job_user.user_deptid=job_dept.dept_id where user_id=%s " # where 1=1是为了便于增 self.getConnection() self.execute(sql, (userId,)) result = self.fetch() finally: self.close() return result pass def updateUser(self, user): try: params = [user.userSex] sql = "update job_user set user_sex=%s " if user.userDeptId > 0: sql += ", user_deptid=%s" params.append(user.userDeptId) sql += ' where user_id=%s' params.append(user.userId) self.getConnection() result = self.execute(sql, params) self.commit() # 执行了sql语句之后要commit return result except Exception as e: print(e) finally: self.close() pass pass def findPageUserList(self, user, pageSize, currentPage): try: params = [] # sql语句和params就需要是动态 sql = "select USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \ "USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \ "from job_user left join job_dept on job_user.user_deptid=job_dept.dept_id where 1=1 " # where 1=1是为了便于增加and if user.userName: sql += " and user_name like %s " # 模糊查询 params.append('%' + user.userName + '%') pass if user.userSex: sql += " and user_sex=%s" params.append(user.userSex) pass startRow = (currentPage - 1)*pageSize sql += "limit %s, %s" params.append(startRow) params.append(pageSize) self.getConnection() self.execute(sql, params) result = self.fetch() finally: self.close() return result pass def countUsers(self, user): params = [] # sql语句和params就需要是动态 sql = "select count(*) from job_user u left join job_dept d on u.user_deptid=d.dept_id where 1=1 " # where 1=1是为了便于增加and if user.userName: sql += " and user_name like %s " # 模糊查询 params.append('%' + user.userName + '%') pass if user.userSex: sql += " and user_sex=%s" params.append(user.userSex) pass self.getConnection() self.execute(sql, params) result = self.fetchOne() return result pass pass
——jobtaskdao.py
from .basedao import BaseDao class JobTaskDao(BaseDao): def createJobTask(self, jobTask): try: sql = "insert into job_collect_task (task_title, job_url) values(%s, %s)" self.getConnection() result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL)) self.commit() # 执行了sql语句之后要commit return result finally: self.close() pass pass def findJobTaskList(self, jobTask): try: params = [] # sql语句和params就需要是动态 sql = "select * from job_collect_task where 1=1 " # where 1=1是为了便于增加and if jobTask.taskTitle: sql += " and task_title like %s " # 模糊查询 params.append('%'+jobTask.taskTitle + '%') pass if jobTask.taskURL: sql += " and task_url=%s" params.append(jobTask.taskURL) pass self.getConnection() self.execute(sql, params) result = self.fetch() finally: self.close() return result pass def removeJobTask(self, taskId): try: sql = "delete from job_collect_task where task_id=%s" self.getConnection() result = self.execute(sql, (taskId, )) self.commit() # 执行了sql语句之后要commit return result finally: self.close() pass pass def findJobTaskByJobTaskId(self, taskId): try: sql = "select * from job_collect_task where task_id=%s" self.getConnection() self.execute(sql, (taskId,)) result = self.fetch() finally: self.close() return result pass def updateJobTask(self, jobTask): try: sql = "update job_collect_task set task_title=%s, task_url=%s where task_id=%s" self.getConnection() result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL, jobTask.taskId)) self.commit() # 执行了sql语句之后要commit return result finally: self.close() pass pass def findPageJobTaskList(self, jobTask, pageSize, currentPage): try: params = [] # sql语句和params就需要是动态 sql = "select task_id, task_title, task_url from job_collect_task where 1=1 " # where 1=1是为了便于增加and if jobTask.taskTitle: sql += " and task_title like %s " # 模糊查询 params.append('%' + jobTask.taskTitle + '%') pass if jobTask.taskURL: sql += " and task_url=%s" params.append(jobTask.taskURL) pass startRow = (currentPage - 1)*pageSize sql += "limit %s, %s" params.append(startRow) params.append(pageSize) self.getConnection() self.execute(sql, params) result = self.fetch() finally: self.close() return result pass def countJobTasks(self, jobTask): params = [] # sql语句和params就需要是动态 sql = "select count(*) from job_collect_task where 1=1 " # where 1=1是为了便于增加and if jobTask.taskTitle: sql += " and task_title like %s " # 模糊查询 params.append('%' + jobTask.taskTitle + '%') pass if jobTask.taskURL: sql += " and task_url=%s" params.append(jobTask.taskURL) pass self.getConnection() self.execute(sql, params) result = self.fetchOne() return result pass pass
entity
——user.py
# 封装数据类 VO:value object entity 类 class User(): def __init__(self): self.__userId = None self.__userName = None self.__userPwd = None self.__userSex = None self.__userPic = None self.__userBirth = None self.__userIntro = None self.__userDeptId = None self.__userDeptName = None self.__userRole = None pass @property def userId(self): return self.__userId pass @userId.setter def userId(self, userId): self.__userId = userId pass @property def userName(self): return self.__userName pass @userName.setter def userName(self, userName): self.__userName = userName pass @property def userPwd(self): return self.__userPwd pass @userPwd.setter def userPwd(self, userPwd): self.__userPwd = userPwd pass @property def userSex(self): return self.__userSex pass @userSex.setter def userSex(self, userSex): self.__userSex = userSex pass @property def userPic(self): return self.__userPic pass @userPic.setter def userPic(self, userPic): self.__userPic = userPic pass @property def userBirth(self): return self.__userBirth pass @userBirth.setter def userBirth(self, userBirth): self.__userBirth = userBirth pass @property def userIntro(self): return self.__userIntro pass @userIntro.setter def userIntro(self, userIntro): self.__userIntro = userIntro pass @property def userDeptId(self): return self.__userDeptId pass @userDeptId.setter def userDeptId(self, userDeptId): self.__userDeptId = userDeptId pass @property def userDeptName(self): return self.__userDeptName pass @userDeptName.setter def userDeptName(self, userDeptName): self.__userDeptName = userDeptName pass @property def userRole(self): return self.__userRole pass @userRole.setter def userRole(self, userRole): self.__userRole = userRole pass pass
filter
防止非法访问过滤器
——rolefilter
from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify rolefilter = Blueprint('rolefilter', __name__) def roleFilter(funcs): adminURL = ['ajaxuserinfo.do','goajaxuserinfo.do'] def innerRole(*args, **kw): user = session.get('user') if user: role = user.get('userRole') # restful url = request.url url = url.split('/')[-1] if role != 1 and url in adminURL: session.clear() return render_template("login.html") pass return funcs(*args, **kw) pass return innerRole pass
——sessionfilter
from flask import Blueprint, Flask, render_template,request,session, url_for,Response, jsonify
sessionfilter = Blueprint('sessionfilter', __name__)
def sessionFilter(func):
def inner(*args, **kw):
user = session.get('user')
if not user:
return render_template("login.html")
pass
return func(*args, **kw)
pass
return inner
pass
service
——userservice
from dao.userdao import UserDao from entity.user import User class UserService: def findUserByUserName(self, userName): userDao = UserDao() return userDao.findUserByUserName(userName) pass def createUser(self, user): userDao = UserDao() return userDao.createUser(user) pass def findUserList(self, user): userDao = UserDao() userlist = [] result = userDao.findUserList(user) for temp in result: tuser = User() tuser.userId = temp[0] tuser.userName = temp[1] tuser.userSex = temp[4] userlist.append(tuser) pass return userlist pass def removeUser(self, userId): userDao = UserDao() return userDao.removeUser(userId) pass def findUserByUserId(self, userId): userDao = UserDao() result = userDao.findUserByUserId(userId) user = None if result: user = User() user.userId = result[0][0] user.userName = result[0][1] user.userSex = result[0][4] user.userDeptId = result[0][13] user.userDeptName = result[0][14] pass return user pass # 修改用户信息 def updateUser(self, user): userDao = UserDao() return userDao.updateUser(user) pass def findPageUserList(self, user, pageSize, currentPage): userDao = UserDao() return userDao.findPageUserList(user, pageSize, currentPage) pass def countUsers(self, user): userDao = UserDao() return userDao.countUsers(user)[0] pass pass
——jobtaskservice
from dao.jobtaskdao import JobTaskDao from dao.jobpostiondao import JobPositionDao from entity.jobtask import JobTask class JobTaskService: def createJobTask(self, jobTask): jobTaskDao = JobTaskDao() return jobTaskDao.createJobTask(jobTask) pass def findJobTaskList(self, jobTask): jobTaskDao = JobTaskDao() jobTasklist = [] result = jobTaskDao.findJobTaskList(jobTask) for temp in result: tjobTask = JobTask() tjobTask.taskId = temp[0] tjobTask.taskTitle = temp[1] tjobTask.taskURL = temp[4] jobTasklist.append(tjobTask) pass return jobTasklist pass def removeJobTask(self, taskId): jobTaskDao = JobTaskDao() return jobTaskDao.removeJobTask(taskId) pass def findJobTaskByJobTaskId(self, taskId): jobTaskDao = JobTaskDao() result = jobTaskDao.findJobTaskByJobTaskId(taskId) jobTask = None if result: jobTask = JobTask() jobTask.taskId = result[0][0] jobTask.taskTitle = result[0][1] jobTask.taskURL = result[0][2] pass return jobTask pass # 修改用户信息 def updateJobTask(self, jobTask): jobTaskDao = JobTaskDao() return jobTaskDao.updateJobTask(jobTask) pass def findPageJobTaskList(self, jobTask, pageSize, currentPage): jobTaskDao = JobTaskDao() return jobTaskDao.findPageJobTaskList(jobTask, pageSize, currentPage) pass def countJobTasks(self, jobTask): jobTaskDao = JobTaskDao() return jobTaskDao.countJobTasks(jobTask)[0] pass def findJobMeanSalary(self): jpd = JobPositionDao() return jpd.findPositionClassify() pass pass
js
——userdata.js
function getUserData(currentPage, pageSize, opr, userId) { var userName = document.searchForm.userName.value var userSex = document.searchForm.userSex.value var userDeptId = 0 if(opr == 'del'){ if(!confirm('确定要删除吗?')){ return false } }else if(opr == 'submitUpdate'){ userName = document.userForm.userName.value userSex = document.userForm.userSex.value userId = document.userForm.userId.value userDeptId = document.userForm.userDeptId.value currentPage = document.userForm.currentPage.value pageSize = document.userForm.pageSize.value } $.ajax({ type: 'post', // 传数据的方式 url: '/ajaxuserinfo.do', dataType: 'json', // xml、json、script、html data:JSON.stringify({ 'userName': userName, // $('#userName') == document.getElementById('userName') 'userSex' : userSex, 'userId': userId, 'userDeptId': userDeptId, 'pageSize': pageSize, 'currentPage': currentPage, 'opr': opr // 重用一个ajax请求实现增加删除修改查询 CRUD }), error: function(xhr, err){ alert('请求失败,请检查,' + err + '!') }, success: function(data, textStatus){ // success对应的回调函数的第一个参数,是服务器返回的数据 // data = JSON.parse(data) if(data.code == 1 && opr != 'update'){ var htmlText = "" for(var i =0;i <data.userData.length;i++){ htmlText += '<tr>' + ' <td align="center"><input type="checkbox" name="userId" value="'+ data.userData[i][0] +'" /></td>\n' + ' <td>' + data.userData[i][0] + '</td>\n' + ' <td>' + data.userData[i][1] + '</td>\n' + ' <td>' + (data.userData[i][4] == 1 ? '男':'女') + '</td>\n' + ' <td>' + data.userData[i][14] + '</td>\n' + ' <td style="width: 160px;">\n' + ' <button type="button" class="btn btn-danger" οnclick="getUserData('+ data.currentPage +',' + data.pageSize + ','+ '\'del\''+',' + data.userData[i][0] +')">删除</button>' + ' <button type="button" class="btn btn-info" οnclick="getUserData('+ data.currentPage +',' + data.pageSize + ','+ '\'update\''+',' + data.userData[i][0] +')">修改</button>'+ ' </td>\n' + ' </tr>\n' } pageText = '<tr style="text-align: right;"><td colspan="6">'+ '当前第' + data.currentPage + '页 总共有' + data.totalPage + '页 '; if(data.currentPage <= 1) { pageText += '首页 上一页 '; }else{ pageText += '<a href="javascript:getUserData(1,10,\'search\', 0);">首页</a> ' + '<a href="javascript:getUserData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a> '; } if(data.currentPage >= data.totalPage){ pageText += '下一页 尾页 '; }else { pageText += '<a href="javascript:getUserData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a> ' + '<a href="javascript:getUserData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a> '; } pageText +='总共有'+ data.counts + '条 </td></tr>' $('#dataBody').empty() $('#dataBody').append(htmlText) $('#dataBody').append(pageText) document.searchForm.currentPage.value = data.currentPage document.searchForm.pageSize.value=data.pageSize if( opr != 'search' && data.updateResult > 0 ) { alert("操作成功") $('#modal-default').modal('hide') }else if(opr != 'search' && data.updateResult <= 0){ alert("操作失败") } }else if(data.code == 1 && opr == 'update'){ document.userForm.userName.value = data.userData.userName if(data.userData.userSex == 1){ document.getElementById('male').checked = 'checked' }else if(data.userData.userSex == 2){ document.getElementById('female').checked = 'checked' } document.userForm.userId.value = data.userData.userId $('#userDept').html(data.userData.userDeptName) document.userForm.userDeptId.value = data.userData.userDeptId document.userForm.currentPage.value = data.currentPage document.userForm.pageSize.value = data.pageSize $('#modal-default').modal() getDeptList(0, null, 1) } } }); } function getDeptList(parentId, obj, grade){ if(parentId == -1){ parentId = obj.value document.userForm.userDeptId.value = obj.value }else if(parentId == -99 || grade == 4){ return false } $.ajax({ type: 'get', // 传数据的方式 url: '/getdeptlist.do', data:{ 'parentId': parentId, // $('#userName') == document.getElementById('userName') }, error: function (xhr, err) { alert('请求失败,请检查,' + err + '!') }, success: function (data, textStatus) { // success对应的回调函数的第一个参数,是服务器返回的数据 data = JSON.parse(data) if(parentId == 0){ if(data.code == 1){ htmlText = '<option value="-99">选择部门</option>' for(var i=0;i<data.data.length;i++){ htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>' } $('#parentDept').html(htmlText) } }else{ if(data.code == 1 && grade == 2){ if(document.getElementById('gradeTwoDept')){ $('#gradeTwoDept').remove() } if(document.getElementById('gradeTreeDept')){ $('#gradeTreeDept').remove() } htmlText = '<select id="gradeTwoDept" οnchange="getDeptList(-1, this,3)" >' htmlText += '<option value="-99">选择子部门</option>' for(var i=0;i<data.data.length;i++){ htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>' } htmlText += "</select>" $('#deptContainer').append(htmlText) }else if(data.code == 1 && grade == 3){ if(document.getElementById('gradeTreeDept')){ $('#gradeTreeDept').remove() } htmlText = '<select id="gradeTreeDept" οnchange="getDeptList(-1, this, 4)" >' htmlText += '<option value="-99">选择子部门</option>' for(var i=0;i<data.data.length;i++){ htmlText += '<option value="' + data.data[i][0] +'">' + data.data[i][1] + '</option>' } htmlText += "</select>" $('#deptContainer').append(htmlText) } } } }) } $(document).ready( function(){ getUserData(1, 10, 'search', 0) } )
——jobtask.js
function getJobTaskData(currentPage, pageSize, opr, taskId) { var taskTitle = document.searchForm.taskTitle.value var taskURL = document.searchForm.taskURL.value if(opr == 'del'){ if(!confirm('确定要删除吗?')){ return false } }else if(opr == 'submitUpdate'){ taskTitle = document.taskForm.taskTitle.value taskURL = document.taskForm.taskURL.value taskId = document.taskForm.taskId.value currentPage = document.taskForm.currentPage.value pageSize = document.taskForm.pageSize.value $('#modal-default').modal('hide') } $.ajax({ type: 'post', // 传数据的方式 url: '/ajaxjobtaskinfo.do', dataType: 'json', // xml、json、script、html data:JSON.stringify({ 'taskTitle': taskTitle, // $('#taskTitle') == document.getElementById('taskTitle') 'taskURL' : taskURL, 'taskId': taskId, 'pageSize': pageSize, 'currentPage': currentPage, 'opr': opr }), error: function(xhr, err){ alert('请求失败,请检查,' + err + '!') }, success: function(data, textStatus){ // success对应的回调函数的第一个参数,是服务器返回的数据 // 查询后、删除后、修改后都走这个if if(data.code == 1 && opr != 'update'){ var htmlText = "" for(var i =0;i <data.jobTaskData.length;i++){ htmlText += '<tr>' + ' <td align="center"><input type="checkbox" name="taskId" value="'+ data.jobTaskData[i][0] +'" /></td>\n' + ' <td>' + data.jobTaskData[i][0] + '</td>\n' + ' <td>' + data.jobTaskData[i][1] + '</td>\n' + ' <td style="width: 500px;word-break: break-all;">' + data.jobTaskData[i][2] + '</td>\n' + ' <td style="width: 160px;">\n' + ' <button type="button" class="btn btn-danger" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'del\''+',' + data.jobTaskData[i][0] +')">删除</button>' + ' <button type="button" class="btn btn-info" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'update\''+',' + data.jobTaskData[i][0] +')">修改</button>'+ ' </td>\n' + ' </tr>\n' } pageText = '<tr style="text-align: right;"><td colspan="5">'+ '当前第' + data.currentPage + '页 总共有' + data.totalPage + '页 '; if(data.currentPage <= 1) { pageText += '首页 上一页 '; }else{ pageText += '<a href="javascript:getJobTaskData(1,10,\'search\', 0);">首页</a> ' + '<a href="javascript:getJobTaskData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a> '; } if(data.currentPage >= data.totalPage){ pageText += '下一页 尾页 '; }else { pageText += '<a href="javascript:getJobTaskData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a> ' + '<a href="javascript:getJobTaskData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a> '; } pageText +='总共有'+ data.counts + '条 </td></tr>' $('#dataBody').empty() $('#dataBody').append(htmlText) $('#dataBody').append(pageText) document.searchForm.currentPage.value = data.currentPage document.searchForm.pageSize.value=data.pageSize if( opr != 'search' && data.updateResult > 0 ) { alert("操作成功") }else if(opr != 'search' && data.updateResult <= 0){ alert("操作失败") } }else if(data.code == 1 && opr == 'update'){ document.taskForm.taskTitle.value = data.jobTaskData.taskTitle document.taskForm.taskURL.value = data.jobTaskData.taskURL document.taskForm.taskId.value = data.jobTaskData.taskId document.taskForm.currentPage.value = data.currentPage document.taskForm.pageSize.value = data.pageSize $('#modal-default').modal() } } }); } $(document).ready( function(){ getJobTaskData(1, 10, 'search', 0) } )
前端页面:
top.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>智能职位数据分析平台</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <!-- Bootstrap 3.3.7 --> <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap/dist/css/bootstrap.min.css') }}"> <!-- Font Awesome --> <link rel="stylesheet" href="{{ url_for('static',filename='font-awesome/css/font-awesome.min.css') }}"> <!-- Ionicons --> <link rel="stylesheet" href="{{ url_for('static',filename='Ionicons/css/ionicons.min.css') }}"> <!-- Theme style --> <link rel="stylesheet" href="{{ url_for('static',filename='css/AdminLTE.min.css') }}"> <!-- AdminLTE Skins. Choose a skin from the css/skins folder instead of downloading all of them to reduce the load. --> <link rel="stylesheet" href="{{ url_for('static',filename='css/skins/_all-skins.min.css') }}"> <!-- Morris chart --> <link rel="stylesheet" href="{{ url_for('static',filename='morris.js/morris.css') }}"> <!-- jvectormap --> <link rel="stylesheet" href="{{ url_for('static',filename='jvectormap/jquery-jvectormap.css') }}"> <!-- Date Picker --> <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css') }}"> <!-- Daterange picker --> <link rel="stylesheet" href="{{ url_for('static',filename='bootstrap-daterangepicker/daterangepicker.css') }}"> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> </head> <body class="hold-transition skin-blue sidebar-mini"> <div class="wrapper"> <header class="main-header"> <!-- Logo --> <a href="/main" class="logo"> <!-- mini logo for sidebar mini 50x50 pixels --> <span class="logo-mini"><b>Job </b>Hutter</span> <!-- logo for regular state and mobile devices --> <span class="logo-lg"><b>职位数据分析</b>平台</span> </a> <!-- Header Navbar: style can be found in header.less --> <nav class="navbar navbar-static-top"> <!-- Sidebar toggle button--> <a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button"> <span class="sr-only">Toggle navigation</span> </a> <div class="navbar-custom-menu"> <ul class="nav navbar-nav"> <!-- Messages: style can be found in dropdown.less--> <li class="dropdown messages-menu"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-envelope-o"></i> <span class="label label-success">4</span> </a> <ul class="dropdown-menu"> <li class="header">You have 4 messages</li> <li> <!-- inner menu: contains the actual data --> <ul class="menu"> <li><!-- start message --> <a href="#"> <div class="pull-left"> <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> </div> <h4> Support Team <small><i class="fa fa-clock-o"></i> 5 mins</small> </h4> <p>Why not buy a new awesome theme?</p> </a> </li> <!-- end message --> <li> <a href="#"> <div class="pull-left"> <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> </div> <h4> AdminLTE Design Team <small><i class="fa fa-clock-o"></i> 2 hours</small> </h4> <p>Why not buy a new awesome theme?</p> </a> </li> <li> <a href="#"> <div class="pull-left"> <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> </div> <h4> Developers <small><i class="fa fa-clock-o"></i> Today</small> </h4> <p>Why not buy a new awesome theme?</p> </a> </li> <li> <a href="#"> <div class="pull-left"> <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> </div> <h4> Sales Department <small><i class="fa fa-clock-o"></i> Yesterday</small> </h4> <p>Why not buy a new awesome theme?</p> </a> </li> <li> <a href="#"> <div class="pull-left"> <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> </div> <h4> Reviewers <small><i class="fa fa-clock-o"></i> 2 days</small> </h4> <p>Why not buy a new awesome theme?</p> </a> </li> </ul> </li> <li class="footer"><a href="#">See All Messages</a></li> </ul> </li> <!-- Notifications: style can be found in dropdown.less --> <li class="dropdown notifications-menu"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-bell-o"></i> <span class="label label-warning">10</span> </a> <ul class="dropdown-menu"> <li class="header">You have 10 notifications</li> <li> <!-- inner menu: contains the actual data --> <ul class="menu"> <li> <a href="#"> <i class="fa fa-users text-aqua"></i> 5 new members joined today </a> </li> <li> <a href="#"> <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems </a> </li> <li> <a href="#"> <i class="fa fa-users text-red"></i> 5 new members joined </a> </li> <li> <a href="#"> <i class="fa fa-shopping-cart text-green"></i> 25 sales made </a> </li> <li> <a href="#"> <i class="fa fa-user text-red"></i> You changed your username </a> </li> </ul> </li> <li class="footer"><a href="#">View all</a></li> </ul> </li> <!-- Tasks: style can be found in dropdown.less --> <li class="dropdown tasks-menu"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-flag-o"></i> <span class="label label-danger">9</span> </a> <ul class="dropdown-menu"> <li class="header">You have 9 tasks</li> <li> <!-- inner menu: contains the actual data --> <ul class="menu"> <li><!-- Task item --> <a href="#"> <h3> Design some buttons <small class="pull-right">20%</small> </h3> <div class="progress xs"> <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> <span class="sr-only">20% Complete</span> </div> </div> </a> </li> <!-- end task item --> <li><!-- Task item --> <a href="#"> <h3> Create a nice theme <small class="pull-right">40%</small> </h3> <div class="progress xs"> <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> <span class="sr-only">40% Complete</span> </div> </div> </a> </li> <!-- end task item --> <li><!-- Task item --> <a href="#"> <h3> Some task I need to do <small class="pull-right">60%</small> </h3> <div class="progress xs"> <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> <span class="sr-only">60% Complete</span> </div> </div> </a> </li> <!-- end task item --> <li><!-- Task item --> <a href="#"> <h3> Make beautiful transitions <small class="pull-right">80%</small> </h3> <div class="progress xs"> <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> <span class="sr-only">80% Complete</span> </div> </div> </a> </li> <!-- end task item --> </ul> </li> <li class="footer"> <a href="#">View all tasks</a> </li> </ul> </li> <!-- User Account: style can be found in dropdown.less --> <li class="dropdown user user-menu"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <img src="{{ session.get('user').get('userPic') }}" class="user-image" alt="User Image"> <span class="hidden-xs">{{ session.get('user').get('userName')}}</span> </a> <ul class="dropdown-menu"> <!-- User image --> <li class="user-header"> <img src="{{ session.get('user').get('userPic') }}" class="img-circle" alt="User Image"> <p> {{ session.get('user').get('userName') }} <small></small> </p> </li> <!-- Menu Body --> <li class="user-body"> <div class="row"> <div class="col-xs-4 text-center"> <a href="#">Followers</a> </div> <div class="col-xs-4 text-center"> <a href="#">Sales</a> </div> <div class="col-xs-4 text-center"> <a href="#">Friends</a> </div> </div> <!-- /.row --> </li> <!-- Menu Footer--> <li class="user-footer"> <div class="pull-left"> <a href="#" class="btn btn-default btn-flat">个人信息</a> </div> <div class="pull-right"> <a href="/logout.do" class="btn btn-default btn-flat">退出</a> </div> </li> </ul> </li> <!-- Control Sidebar Toggle Button --> <li> <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> </li> </ul> </div> </nav> </header>
left.html
<!-- Left side column. contains the logo and sidebar --> <aside class="main-sidebar"> <!-- sidebar: style can be found in sidebar.less --> <section class="sidebar"> <!-- sidebar menu: : style can be found in sidebar.less --> <ul class="sidebar-menu" data-widget="tree"> <li class="header">导航菜单</li> <li class="active treeview"> <a href="#"> <i class="fa fa-dashboard"></i> <span>数据分析管理</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li class="active"><a href="/main"><i class="fa fa-circle-o"></i> 职位分析报表</a></li> <li><a href="/main"><i class="fa fa-circle-o"></i> 行业分析报表</a></li> </ul> </li> <li class="treeview"> <a href="#"> <i class="fa fa-files-o"></i> <span>职位数据采集</span> <span class="pull-right-container"> <span class="label label-primary pull-right">4</span> </span> </a> <ul class="treeview-menu"> <li><a href="/goajaxjobtaskinfo.do"><i class="fa fa-circle-o"></i> 采集任务管理</a></li> <li><a href="/goajaxgoodsinfo.do"><i class="fa fa-circle-o"></i> 购物管理</a></li> <li><a href="/goajaxtypeinfo.do"><i class="fa fa-circle-o"></i> 购物类型管理</a></li> <li><a href="pages/layout/boxed.html"><i class="fa fa-circle-o"></i> 采集结果分析</a></li> <li><a href="pages/layout/fixed.html"><i class="fa fa-circle-o"></i> 采集数据管理</a></li> </ul> </li> <li class="treeview"> <a href="#"> <i class="fa fa-laptop"></i> <span>个人事务管理</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="pages/UI/general.html"><i class="fa fa-circle-o"></i> 个人信息管理</a></li> <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> 待办事项管理</a></li> <li><a href="pages/UI/buttons.html"><i class="fa fa-circle-o"></i> 内部消息管理</a></li> <li><a href="pages/UI/sliders.html"><i class="fa fa-circle-o"></i> 密码管理</a></li> </ul> </li> {% if session.get('user').get('userRole') == 1 %} <li class="treeview"> <a href="#"> <i class="fa fa-pie-chart"></i> <span>系统功能管理</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="/goajaxuserinfo.do"><i class="fa fa-circle-o"></i> 用户管理</a></li> <li><a href="pages/charts/morris.html"><i class="fa fa-circle-o"></i> 角色管理</a></li> <li><a href="pages/charts/flot.html"><i class="fa fa-circle-o"></i> 权限管理</a></li> <li><a href="pages/charts/inline.html"><i class="fa fa-circle-o"></i> 系统参数管理</a></li> </ul> </li> {% endif %} <li class="treeview"> <a href="#"> <i class="fa fa-edit"></i> <span>Forms</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="pages/forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> <li><a href="pages/forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> <li><a href="pages/forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> </ul> </li> <li class="treeview"> <a href="#"> <i class="fa fa-table"></i> <span>Tables</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="pages/tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> <li><a href="pages/tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> </ul> </li> <li> <a href="pages/calendar.html"> <i class="fa fa-calendar"></i> <span>Calendar</span> <span class="pull-right-container"> <small class="label pull-right bg-red">3</small> <small class="label pull-right bg-blue">17</small> </span> </a> </li> <li> <a href="pages/mailbox/mailbox.html"> <i class="fa fa-envelope"></i> <span>Mailbox</span> <span class="pull-right-container"> <small class="label pull-right bg-yellow">12</small> <small class="label pull-right bg-green">16</small> <small class="label pull-right bg-red">5</small> </span> </a> </li> <li class="treeview"> <a href="#"> <i class="fa fa-folder"></i> <span>Examples</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="pages/examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> <li><a href="pages/examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> <li><a href="pages/examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> <li><a href="pages/examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> <li><a href="pages/examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> <li><a href="pages/examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> <li><a href="pages/examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> <li><a href="pages/examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> <li><a href="pages/examples/pace.html"><i class="fa fa-circle-o"></i> Pace Page</a></li> </ul> </li> <li class="treeview"> <a href="#"> <i class="fa fa-share"></i> <span>Multilevel</span> <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> <li class="treeview"> <a href="#"><i class="fa fa-circle-o"></i> Level One <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> <li class="treeview"> <a href="#"><i class="fa fa-circle-o"></i> Level Two <span class="pull-right-container"> <i class="fa fa-angle-left pull-right"></i> </span> </a> <ul class="treeview-menu"> <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> </ul> </li> </ul> </li> <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> </ul> </li> <li><a href="https://adminlte.io/docs"><i class="fa fa-book"></i> <span>Documentation</span></a></li> <li class="header">LABELS</li> <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> </ul> </section> <!-- /.sidebar --> </aside>
main.html
{% include 'top.html' %} {% include 'left.html' %} <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <h1> 职位分布 <small>IT行业之分分析</small> </h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> 职位分布</a></li> <li class="active">职位总览</li> </ol> </section> <!-- Main content --> <section class="content"> <!-- Small boxes (Stat box) --> <!-- Main row --> <div class="row"> <!-- Left col --> <section class="col-lg-7 connectedSortable"> <!-- Custom tabs (Charts with tabs)--> <div class="nav-tabs-custom"> <!-- Tabs within a box --> <ul class="nav nav-tabs pull-right"> <li class="active"><a href="#revenue-chart" data-toggle="tab">Java语言</a></li> <li><a href="#sales-chart" data-toggle="tab">Python语言</a></li> <li class="pull-left header"><i class="fa fa-inbox"></i> 职位分布</li> </ul> <div class="tab-content no-padding"> <!-- Morris chart - Sales --> <div class="chart tab-pane active" id="java-chart" style="position: relative; height: 300px;"></div> <div class="chart tab-pane" id="python-chart" style="position: relative; height: 300px;"></div> </div> </div> <!-- /.nav-tabs-custom --> <!-- Chat box --> <div class="box box-success"> <div class="box-header"> <i class="fa fa-comments-o"></i> <h3 class="box-title">开发语言薪资对比图</h3> <div class="box-tools pull-right" data-toggle="tooltip" title="Status"> <div class="btn-group" data-toggle="btn-toggle"> <button type="button" class="btn btn-default btn-sm active"><i class="fa fa-square text-green"></i> </button> <button type="button" class="btn btn-default btn-sm"><i class="fa fa-square text-red"></i></button> </div> </div> </div> <div class="box-body chat"> <div id="salary-box" style="height: 250px; width: 100%;"></div> </div> <!-- /.chat --> </div> <!-- /.box (chat box) --> <!-- TO DO List --> <div class="box box-primary"> <div class="box-header"> <i class="ion ion-clipboard"></i> <h3 class="box-title">To Do List</h3> <div class="box-tools pull-right"> <ul class="pagination pagination-sm inline"> <li><a href="#">«</a></li> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">»</a></li> </ul> </div> </div> <!-- /.box-header --> <div class="box-body"> <!-- See dist/js/pages/dashboard.js to activate the todoList plugin --> <ul class="todo-list"> <li> <!-- drag handle --> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <!-- checkbox --> <input type="checkbox" value=""> <!-- todo text --> <span class="text">Design a nice theme</span> <!-- Emphasis label --> <small class="label label-danger"><i class="fa fa-clock-o"></i> 2 mins</small> <!-- General tools such as edit or delete--> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> <li> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <input type="checkbox" value=""> <span class="text">Make the theme responsive</span> <small class="label label-info"><i class="fa fa-clock-o"></i> 4 hours</small> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> <li> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <input type="checkbox" value=""> <span class="text">Let theme shine like a star</span> <small class="label label-warning"><i class="fa fa-clock-o"></i> 1 day</small> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> <li> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <input type="checkbox" value=""> <span class="text">Let theme shine like a star</span> <small class="label label-success"><i class="fa fa-clock-o"></i> 3 days</small> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> <li> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <input type="checkbox" value=""> <span class="text">Check your messages and notifications</span> <small class="label label-primary"><i class="fa fa-clock-o"></i> 1 week</small> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> <li> <span class="handle"> <i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i> </span> <input type="checkbox" value=""> <span class="text">Let theme shine like a star</span> <small class="label label-default"><i class="fa fa-clock-o"></i> 1 month</small> <div class="tools"> <i class="fa fa-edit"></i> <i class="fa fa-trash-o"></i> </div> </li> </ul> </div> <!-- /.box-body --> <div class="box-footer clearfix no-border"> <button type="button" class="btn btn-default pull-right"><i class="fa fa-plus"></i> Add item</button> </div> </div> <!-- /.box --> <!-- quick email widget --> <div class="box box-info"> <div class="box-header"> <i class="fa fa-envelope"></i> <h3 class="box-title">Quick Email</h3> <!-- tools box --> <div class="pull-right box-tools"> <button type="button" class="btn btn-info btn-sm" data-widget="remove" data-toggle="tooltip" title="Remove"> <i class="fa fa-times"></i></button> </div> <!-- /. tools --> </div> <div class="box-body"> <form action="#" method="post"> <div class="form-group"> <input type="email" class="form-control" name="emailto" placeholder="Email to:"> </div> <div class="form-group"> <input type="text" class="form-control" name="subject" placeholder="Subject"> </div> <div> <textarea class="textarea" placeholder="Message" style="width: 100%; height: 125px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea> </div> </form> </div> <div class="box-footer clearfix"> <button type="button" class="pull-right btn btn-default" id="sendEmail">Send <i class="fa fa-arrow-circle-right"></i></button> </div> </div> </section> <!-- /.Left col --> <!-- right col (We are only adding the ID to make the widgets sortable)--> <section class="col-lg-5 connectedSortable"> <!-- Map box --> <div class="box box-solid bg-light-blue-gradient"> <div class="box-header"> <!-- tools box --> <div class="pull-right box-tools"> <button type="button" class="btn btn-primary btn-sm daterange pull-right" data-toggle="tooltip" title="Date range"> <i class="fa fa-calendar"></i></button> <button type="button" class="btn btn-primary btn-sm pull-right" data-widget="collapse" data-toggle="tooltip" title="Collapse" style="margin-right: 5px;"> <i class="fa fa-minus"></i></button> </div> <!-- /. tools --> <i class="fa fa-map-marker"></i> <h3 class="box-title"> 开发语言职位占比 </h3> </div> <div class="box-body"> <div id="jobPie" style="height: 250px; width: 100%;"></div> </div> <!-- /.box-body--> <div class="box-footer no-border"> <div class="row"> <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> <div id="sparkline-1"></div> <div class="knob-label">Visitors</div> </div> <!-- ./col --> <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> <div id="sparkline-2"></div> <div class="knob-label">Online</div> </div> <!-- ./col --> <div class="col-xs-4 text-center"> <div id="sparkline-3"></div> <div class="knob-label">Exists</div> </div> <!-- ./col --> </div> <!-- /.row --> </div> </div> <!-- /.box --> <!-- solid sales graph --> <div class="box box-solid bg-teal-gradient"> <div class="box-header"> <i class="fa fa-th"></i> <h3 class="box-title">Sales Graph</h3> <div class="box-tools pull-right"> <button type="button" class="btn bg-teal btn-sm" data-widget="collapse"><i class="fa fa-minus"></i> </button> <button type="button" class="btn bg-teal btn-sm" data-widget="remove"><i class="fa fa-times"></i> </button> </div> </div> <div class="box-body border-radius-none"> <div class="chart" id="line-chart" style="height: 250px;"></div> </div> <!-- /.box-body --> <div class="box-footer no-border"> <div class="row"> <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> <input type="text" class="knob" data-readonly="true" value="20" data-width="60" data-height="60" data-fgColor="#39CCCC"> <div class="knob-label">Mail-Orders</div> </div> <!-- ./col --> <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> <input type="text" class="knob" data-readonly="true" value="50" data-width="60" data-height="60" data-fgColor="#39CCCC"> <div class="knob-label">Online</div> </div> <!-- ./col --> <div class="col-xs-4 text-center"> <input type="text" class="knob" data-readonly="true" value="30" data-width="60" data-height="60" data-fgColor="#39CCCC"> <div class="knob-label">In-Store</div> </div> <!-- ./col --> </div> <!-- /.row --> </div> <!-- /.box-footer --> </div> <!-- /.box --> <!-- Calendar --> <div class="box box-solid bg-green-gradient"> <div class="box-header"> <i class="fa fa-calendar"></i> <h3 class="box-title">Calendar</h3> <!-- tools box --> <div class="pull-right box-tools"> <!-- button with a dropdown --> <div class="btn-group"> <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-bars"></i></button> <ul class="dropdown-menu pull-right" role="menu"> <li><a href="#">Add new event</a></li> <li><a href="#">Clear events</a></li> <li class="divider"></li> <li><a href="#">View calendar</a></li> </ul> </div> <button type="button" class="btn btn-success btn-sm" data-widget="collapse"><i class="fa fa-minus"></i> </button> <button type="button" class="btn btn-success btn-sm" data-widget="remove"><i class="fa fa-times"></i> </button> </div> <!-- /. tools --> </div> <!-- /.box-header --> <div class="box-body no-padding"> <!--The calendar --> <div id="calendar" style="width: 100%"></div> </div> <!-- /.box-body --> <div class="box-footer text-black"> <div class="row"> <div class="col-sm-6"> <!-- Progress bars --> <div class="clearfix"> <span class="pull-left">Task #1</span> <small class="pull-right">90%</small> </div> <div class="progress xs"> <div class="progress-bar progress-bar-green" style="width: 90%;"></div> </div> <div class="clearfix"> <span class="pull-left">Task #2</span> <small class="pull-right">70%</small> </div> <div class="progress xs"> <div class="progress-bar progress-bar-green" style="width: 70%;"></div> </div> </div> <!-- /.col --> <div class="col-sm-6"> <div class="clearfix"> <span class="pull-left">Task #3</span> <small class="pull-right">60%</small> </div> <div class="progress xs"> <div class="progress-bar progress-bar-green" style="width: 60%;"></div> </div> <div class="clearfix"> <span class="pull-left">Task #4</span> <small class="pull-right">40%</small> </div> <div class="progress xs"> <div class="progress-bar progress-bar-green" style="width: 40%;"></div> </div> </div> <!-- /.col --> </div> <!-- /.row --> </div> </div> <!-- /.box --> </section> <!-- right col --> </div> <!-- /.row (main row) --> </section> <!-- /.content --> </div> <!-- /.content-wrapper --> {% include 'footer.html' %} <script src="{{ url_for('static',filename='echarts/echarts.js') }}"></script> <script src="{{ url_for('static',filename='echarts/china.js') }}"></script> <script src="{{ url_for('static',filename='echarts/chartsdata.js') }}"></script>
login.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>登录</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <!-- Bootstrap 3.3.7 --> <link rel="stylesheet" href="static/bootstrap/dist/css/bootstrap.min.css"> <!-- Font Awesome --> <link rel="stylesheet" href="static/font-awesome/css/font-awesome.min.css"> <!-- Ionicons --> <link rel="stylesheet" href="static/bower_components/Ionicons/css/ionicons.min.css"> <!-- Theme style --> <link rel="stylesheet" href="static/css/AdminLTE.css"> </head> <body class="hold-transition login-page"> <div class="login-box"> <div class="login-logo"> <a href="#">职位数据分析平台</a> </div> <!-- /.login-logo --> <div class="login-box-body"> <p class="login-box-msg">亲,请登录:</p> <form action="login.do" method="post"> <div class="form-group has-feedback"> <input type="text" name="userName" class="form-control" placeholder="用户名" required> <span class="glyphicon glyphicon-user form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input type="password" name="userPwd" class="form-control" placeholder="密码" required> <span class="glyphicon glyphicon-lock form-control-feedback"></span> </div> <div class="row"> <div class="col-xs-8"> <div class="checkbox icheck"> <label> <input type="checkbox"> 记住密码 </label> </div> </div> <!-- /.col --> <div class="col-xs-4"> <button type="submit" class="btn btn-primary btn-block btn-flat">登录</button> </div> <!-- /.col --> </div> </form> <div class="social-auth-links text-center"> <p></p> <a href="#" class="btn btn-block btn-social btn-primary btn-flat"><i class="fa fa-qq"></i> 使用QQ登录</a> <a href="#" class="btn btn-block btn-social btn-success btn-flat"><i class="fa fa-weixin"></i> 使用微信登录</a> </div> <!-- /.social-auth-links --> <a href="#">忘记密码</a><br> <a href="register.html" class="text-center">注册新用户</a> </div> <!-- /.login-box-body --> </div> <!-- /.login-box --> <!-- jQuery 3 --> <script src="static/jquery/dist/jquery.min.js"></script> <!-- Bootstrap 3.3.7 --> <script src="static/bootstrap/dist/js/bootstrap.min.js"></script> </body> </html>
userinfo.html
{% include 'top.html' %} {% include 'left.html' %} <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <h1> 系统管理 <small>用户信息管理</small> </h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> 系统管理</a></li> <li><a href="#">系统用户</a></li> <li class="active">用户信息管理</li> </ol> </section> <!-- Main content --> <section class="content"> <div class="row"> <div class="col-xs-12"> <div class="box"> <div class="box-header"> <h3 class="box-title">用户信息</h3> </div> <!-- /.box-header --> <div class="box-body"> <form method="post" name="searchForm" class="form-inline"> <div class="form-group"> <div class="form-group"> <label class="control-label" for="userName">用户名:</label> <input type="text" name="userName" class="form-control" id="userName"/> </div> <div class="form-group"> <label class="control-label" for="userPwd">性别: </label> <input type="text" name="userSex" class="form-control" id="userPwd" /> </div> <input type="hidden" name="currentPage" value="1"/> <input type="hidden" name="pageSize" value="10"/> <button class="btn btn-primary" type="button" οnclick="getUserData(1, 10, 'search', 0)">查询</button> </div> </form> <table class="table table-responsive table-bordered"> <caption>{{ message }}</caption> <thead> <tr> <th style="text-align: center;width: 80px;"> <input type="button" value="全选"/> </th> <th>用户ID</th> <th>用户名</th> <th>用户性别</th> <th>部门</th> <th>操作</th> </tr> </thead> <tbody id="dataBody"> </tbody> </table> <div class="modal fade" id="modal-default"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span></button> <h4 class="modal-title">修改用户信息</h4> </div> <div class="modal-body"> <form method="post" name="userForm" > <div class="form-group"> <label for="userName" class="control-label">用户名:</label> <input type="text" name="userName" class="form-control"/> </div> <div class="form-group"> <label for="userSex" class="control-label">性别: <input type="radio" id="male" name="userSex" value="1">男 <input type="radio" id="female" name="userSex" value="2">女 </label> </div> <div class="form-group"> <label for="userDept" class="control-label">部门: <span id="userDept"></span> <input type="hidden" name="userDeptId" id="userDeptId" value="0"/> <div id="deptContainer"> <select id="parentDept" οnchange="getDeptList(-1, this, 2)"> <option value="-99">选择部门</option> </select> </div> </label> </div> <input type="hidden" name="userId"/> <input type="hidden" name="currentPage" value="1"/> <input type="hidden" name="pageSize" value="10"/> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button> <button type="button" class="btn btn-primary" οnclick="getUserData(1, 10, 'submitUpdate', 0)">保存</button> </div> </div> <!-- /.modal-content --> </div> <!-- /.modal-dialog --> </div> </div> <!-- /.box-body --> </div> <!-- /.box --> </div> <!-- /.col --> </div> <!-- /.row --> </section> <!-- /.content --> </div> <!-- /.content-wrapper --> {% include 'footer.html' %} <script type="text/javascript" src="{{ url_for('static',filename='js/formvalidator.js') }}"></script> <script type="text/javascript" src="{{ url_for('static',filename='js/userdata.js') }}"></script>
userinfo_fresh.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户管理</title> <script type="text/javascript" src="{{ url_for('static',filename='js/jquery-3.2.1.min.js') }}"></script> <script type="text/javascript" src="{{ url_for('static',filename='js/formvalidator.js') }}"></script> </head> <body> <form action="/gouserinfo.do" method="post"> 用户名:<input type="text" name="userName" /> 性别:<input type="text" name="userSex" /> <input type="submit" value="查询"> </form> <table align="center"> <caption>{{ message }}</caption> <thead> <tr> <th> <input type="button" value="全选"/> <input type="button" value="反选"/> </th> <th>用户ID</th> <th>用户名</th> <th>用户性别</th> <th>操作</th> </tr> </thead> <tbody> {% for user in userList %} <tr> <td align="center"><input type="checkbox" name="userId" value="{{ user.userId }}" /></td> <td>{{ user.userId }}</td> <td>{{ user.userName }}</td> <td>{{ user.userSex }}</td> <td> <a href="javascript:submitRemoveUser('{{ user.userId }}')">删除</a> <a href="/gomodifyuser.do?userId={{ user.userId }}">修改</a> </td> </tr> {% endfor %} </tbody> </table> </body> </html>
footer.html
<footer class="main-footer"> <div class="pull-right hidden-xs"> <b>Version</b> 2.4.0 </div> <strong>Copyright © 2014-2016 <a href="https://adminlte.io">Almsaeed Studio</a>.</strong> All rights reserved. </footer> <!-- Control Sidebar --> <aside class="control-sidebar control-sidebar-dark"> <!-- Create the tabs --> <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> </ul> <!-- Tab panes --> <div class="tab-content"> <!-- Home tab content --> <div class="tab-pane" id="control-sidebar-home-tab"> <h3 class="control-sidebar-heading">Recent Activity</h3> <ul class="control-sidebar-menu"> <li> <a href="javascript:void(0)"> <i class="menu-icon fa fa-birthday-cake bg-red"></i> <div class="menu-info"> <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> <p>Will be 23 on April 24th</p> </div> </a> </li> <li> <a href="javascript:void(0)"> <i class="menu-icon fa fa-user bg-yellow"></i> <div class="menu-info"> <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> <p>New phone +1(800)555-1234</p> </div> </a> </li> <li> <a href="javascript:void(0)"> <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> <div class="menu-info"> <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> <p>nora@example.com</p> </div> </a> </li> <li> <a href="javascript:void(0)"> <i class="menu-icon fa fa-file-code-o bg-green"></i> <div class="menu-info"> <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> <p>Execution time 5 seconds</p> </div> </a> </li> </ul> <!-- /.control-sidebar-menu --> <h3 class="control-sidebar-heading">Tasks Progress</h3> <ul class="control-sidebar-menu"> <li> <a href="javascript:void(0)"> <h4 class="control-sidebar-subheading"> Custom Template Design <span class="label label-danger pull-right">70%</span> </h4> <div class="progress progress-xxs"> <div class="progress-bar progress-bar-danger" style="width: 70%"></div> </div> </a> </li> <li> <a href="javascript:void(0)"> <h4 class="control-sidebar-subheading"> Update Resume <span class="label label-success pull-right">95%</span> </h4> <div class="progress progress-xxs"> <div class="progress-bar progress-bar-success" style="width: 95%"></div> </div> </a> </li> <li> <a href="javascript:void(0)"> <h4 class="control-sidebar-subheading"> Laravel Integration <span class="label label-warning pull-right">50%</span> </h4> <div class="progress progress-xxs"> <div class="progress-bar progress-bar-warning" style="width: 50%"></div> </div> </a> </li> <li> <a href="javascript:void(0)"> <h4 class="control-sidebar-subheading"> Back End Framework <span class="label label-primary pull-right">68%</span> </h4> <div class="progress progress-xxs"> <div class="progress-bar progress-bar-primary" style="width: 68%"></div> </div> </a> </li> </ul> <!-- /.control-sidebar-menu --> </div> <!-- /.tab-pane --> <!-- Stats tab content --> <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div> <!-- /.tab-pane --> <!-- Settings tab content --> <div class="tab-pane" id="control-sidebar-settings-tab"> <form method="post"> <h3 class="control-sidebar-heading">General Settings</h3> <div class="form-group"> <label class="control-sidebar-subheading"> Report panel usage <input type="checkbox" class="pull-right" checked> </label> <p> Some information about this general settings option </p> </div> <!-- /.form-group --> <div class="form-group"> <label class="control-sidebar-subheading"> Allow mail redirect <input type="checkbox" class="pull-right" checked> </label> <p> Other sets of options are available </p> </div> <!-- /.form-group --> <div class="form-group"> <label class="control-sidebar-subheading"> Expose author name in posts <input type="checkbox" class="pull-right" checked> </label> <p> Allow the user to show his name in blog posts </p> </div> <!-- /.form-group --> <h3 class="control-sidebar-heading">Chat Settings</h3> <div class="form-group"> <label class="control-sidebar-subheading"> Show me as online <input type="checkbox" class="pull-right" checked> </label> </div> <!-- /.form-group --> <div class="form-group"> <label class="control-sidebar-subheading"> Turn off notifications <input type="checkbox" class="pull-right"> </label> </div> <!-- /.form-group --> <div class="form-group"> <label class="control-sidebar-subheading"> Delete chat history <a href="javascript:void(0)" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> </label> </div> <!-- /.form-group --> </form> </div> <!-- /.tab-pane --> </div> </aside> <!-- /.control-sidebar --> <!-- Add the sidebar's background. This div must be placed immediately after the control sidebar --> <div class="control-sidebar-bg"></div> </div> <!-- ./wrapper --> <!-- jQuery 3 --> <script src="{{ url_for('static',filename='jquery/dist/jquery.min.js') }}"></script> <!-- jQuery UI 1.11.4 --> <script src="{{ url_for('static',filename='jquery-ui/jquery-ui.min.js') }}"></script> <!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> <script> $.widget.bridge('uibutton', $.ui.button); </script> <!-- Bootstrap 3.3.7 --> <script src="{{ url_for('static',filename='bootstrap/dist/js/bootstrap.min.js') }}"></script> <!-- Morris.js charts --> <script src="{{ url_for('static',filename='raphael/raphael.min.js') }}"></script> <script src="{{ url_for('static',filename='morris.js/morris.min.js') }}"></script> <!-- Sparkline --> <script src="{{ url_for('static',filename='jquery-sparkline/dist/jquery.sparkline.min.js') }}"></script> <!-- jQuery Knob Chart --> <script src="{{ url_for('static',filename='jquery-knob/dist/jquery.knob.min.js') }}"></script> <!-- daterangepicker --> <script src="{{ url_for('static',filename='moment/min/moment.min.js') }}"></script> <script src="{{ url_for('static',filename='bootstrap-daterangepicker/daterangepicker.js') }}"></script> <!-- datepicker --> <script src="{{ url_for('static',filename='bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js') }}"></script> <!-- Slimscroll --> <script src="{{ url_for('static',filename='jquery-slimscroll/jquery.slimscroll.min.js') }}"></script> <!-- FastClick --> <script src="{{ url_for('static',filename='fastclick/lib/fastclick.js') }}"></script> <!-- AdminLTE App --> <script src="{{ url_for('static',filename='js/adminlte.min.js') }}"></script> <!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script src="{{ url_for('static',filename='js/pages/dashboard.js') }}"></script> <!-- AdminLTE for demo purposes --> <script src="{{ url_for('static',filename='js/demo.js') }}"></script> </body> </html>
jobtaskinfo.html
{% include 'top.html' %} {% include 'left.html' %} <div class="content-wrapper"> <!-- Content Header (Page header) --> <section class="content-header"> <h1> 系统管理 <small>任务信息管理</small> </h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> 采集管理</a></li> <li><a href="#">系统任务</a></li> <li class="active">任务信息管理</li> </ol> </section> <!-- Main content --> <section class="content"> <div class="row"> <div class="col-xs-12"> <div class="box"> <div class="box-header"> <h3 class="box-title">任务信息</h3> </div> <!-- /.box-header --> <div class="box-body"> <form method="post" name="searchForm" class="form-inline"> <div class="form-group"> <div class="form-group"> <label class="control-label" for="taskTitle">任务名:</label> <input type="text" name="taskTitle" class="form-control" id="taskTitle"/> </div> <div class="form-group"> <label class="control-label" for="taskURL">任务地址: </label> <input type="text" name="taskURL" class="form-control" id="taskURL" /> </div> <input type="hidden" name="currentPage" value="1"/> <input type="hidden" name="pageSize" value="10"/> <button class="btn btn-primary" type="button" οnclick="getJobTaskData(1, 10, 'search', 0)">查询</button> </div> </form> <table class="table table-responsive table-bordered"> <caption>{{ message }}</caption> <thead> <tr> <th style="text-align: center;width: 80px;"> <input type="button" value="全选"/> </th> <th>任务ID</th> <th>任务名称</th> <th style="width: 300px;word-wrap: break-word;overflow: hidden;">任务URL地址</th> <th>操作</th> </tr> </thead> <tbody id="dataBody"> </tbody> </table> <div class="modal fade" id="modal-default"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span></button> <h4 class="modal-title">修改任务信息</h4> </div> <div class="modal-body"> <form method="post" name="taskForm"> 任务名称:<input type="text" name="taskTitle" /> 采集URL地址: <input type="text" name="taskURL" /> <input type="hidden" name="taskId"/> <input type="hidden" name="currentPage" value="1"/> <input type="hidden" name="pageSize" value="10"/> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button> <button type="button" class="btn btn-primary" οnclick="getJobTaskData(1, 10, 'submitUpdate', 0)">保存</button> </div> </div> <!-- /.modal-content --> </div> <!-- /.modal-dialog --> </div> </div> <!-- /.box-body --> </div> <!-- /.box --> </div> <!-- /.col --> </div> <!-- /.row --> </section> <!-- /.content --> </div> <!-- /.content-wrapper --> {% include 'footer.html' %} <script type="text/javascript" src="{{ url_for('static',filename='js/jobtask.js') }}"></script>
程序启动入口: app.py
from flask import Flask, render_template,request,session, url_for,Response import config from config_class import * from datetime import timedelta from controller.usercontroller import usercontroller from filter.sessionfilter import sessionfilter from controller.jobcontroller import jobtaskcontroller from controller.deptcontroller import deptcontroller from controller.goodscontroller import goodscontroller from controller.goodstypecontroller import goodstypecontroller from filter.rolefilter import rolefilter import hashlib app = Flask(__name__) app.config['DEBUG'] = True app.config['SECRET_KEY'] = 'AAAGGGGCCFDDDFFFDDDD' app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30) #设置session的保存时间。 # 是使用config py文件定义配置 app.config.from_object(config) # 是使用class定义配置 app.config.from_object(DebugConfig) app.register_blueprint(usercontroller) # 声明 app.register_blueprint(jobtaskcontroller) app.register_blueprint(deptcontroller) app.register_blueprint(goodscontroller) app.register_blueprint(goodstypecontroller) @app.route('/') # URL路由 def index(): print(session.get('user')) return render_template('index.html') @app.route('/main') # URL路由 def main(): return render_template('main.html') pass if __name__ == '__main__': app.run(host=app.config['SERVER_ADDR'], port=app.config['SERVER_PORT'], debug=True) ''' 关于 PyCharm2018 后续版本中修改 host port 以及 Debug 本人在使用 PyCharm 时,普通教程中给出的修改 host,port 以及 debug 方法都不能在我这里体现出来, 搜索“flask 无法修改服务器端口”,“flask 无法修改 host 和 port ” 以及 “flask cannot change port or host ” 这样的字段半天之后,终于找到了解决方案 修改 Debug 模式需要点击右上角运行按钮左侧,选择 Edit-Configuration 找到 FLASK_DEBUG 打上勾即可 修改 host 以及 port 有两种方式 1. 修改app.run()代码如下 if __name__ == '__main__' app.run(host='x.x.x.x',port=8000) 然后进入cmd,找到 app.py 文件所在的位置 '''
有什么不足,还请大神多多指点!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。