diff --git a/groups/templates/groups/index.html b/groups/templates/groups/index.html index 4c8aa885..3bc6954a 100644 --- a/groups/templates/groups/index.html +++ b/groups/templates/groups/index.html @@ -39,7 +39,7 @@
- 更多分析 + 更多分析 @@ -54,7 +54,7 @@
- 更多分析 + 更多分析 @@ -69,7 +69,7 @@
- 更多分析 + 更多分析 @@ -84,7 +84,7 @@
- 更多分析 + 更多分析
diff --git a/groups/views.py b/groups/views.py index 42c312a6..dbbe2962 100644 --- a/groups/views.py +++ b/groups/views.py @@ -21,6 +21,7 @@ def check_login(func): # 自定义登录验证装饰器 return redirect('/groups/login') return warpper + def login(request): # 不允许重复登录 if request.session.get('is_login', None): diff --git a/mysite/settings.py b/mysite/settings.py index b1fb09f1..01ffba4e 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -10,7 +10,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """ -import os +import os,time import psycopg2.extensions # Build paths inside the project like this: os.path.join(BASE_DIR, ...) @@ -146,5 +146,82 @@ CELERY_ENABLE_UTC=True ##配置session SESSION_EXPIRE_AT_BROWSER_CLOSE = True +SESSION_COOKIE_AGE = 1800 SESSION_SAVE_EVERY_REQUEST = True +#日志配置 +# 创建日志的路径 +LOG_PATH = os.path.join(BASE_DIR, 'log') +# 如果地址不存在,则自动创建log文件夹 +if not os.path.join(LOG_PATH): + os.mkdir(LOG_PATH) +LOGGING = { + 'version': 1, + 'disable_existing_loggers': True, + 'formatters': { + # 日志格式 + 'standard': { + 'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] ' + '[%(levelname)s]- %(message)s'}, + 'simple': { # 简单格式 + 'format': '%(levelname)s %(message)s' + }, + }, + # 过滤 + 'filters': { + }, + # 定义具体处理日志的方式 + 'handlers': { + # 默认记录所有日志 + 'default': { + 'level': 'INFO', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(LOG_PATH, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))), + 'maxBytes': 1024 * 1024 * 5, # 文件大小 + 'backupCount': 5, # 备份数 + 'formatter': 'standard', # 输出格式 + 'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码 + }, + # 输出错误日志 + 'error': { + 'level': 'ERROR', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(LOG_PATH, 'error-{}.log'.format(time.strftime('%Y-%m-%d'))), + 'maxBytes': 1024 * 1024 * 5, # 文件大小 + 'backupCount': 5, # 备份数 + 'formatter': 'standard', # 输出格式 + 'encoding': 'utf-8', # 设置默认编码 + }, + # 控制台输出 + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'standard' + }, + # 输出info日志 + 'info': { + 'level': 'INFO', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(LOG_PATH, 'info-{}.log'.format(time.strftime('%Y-%m-%d'))), + 'maxBytes': 1024 * 1024 * 5, + 'backupCount': 5, + 'formatter': 'standard', + 'encoding': 'utf-8', # 设置默认编码 + }, + }, + # 配置用哪几种 handlers 来处理日志 + 'loggers': { + # 类型 为 django 处理所有类型的日志, 默认调用 + 'django': { + 'handlers': ['default', 'console'], + 'level': 'INFO', + 'propagate': False + }, + # log 调用时需要当作参数传入 + 'log': { + 'handlers': ['error', 'info', 'console', 'default'], + 'level': 'INFO', + 'propagate': True + }, + } +} \ No newline at end of file diff --git a/safesite/static/safesite/mystatic/css/style.css b/safesite/static/safesite/mystatic/css/style.css index e9339c47..f241c8f0 100644 --- a/safesite/static/safesite/mystatic/css/style.css +++ b/safesite/static/safesite/mystatic/css/style.css @@ -101,15 +101,15 @@ canvas{ } .login{z-index: 2;position:absolute;width: 350px;border-radius: 5px;height: 500px;box-shadow: 0px 0px 5px #333333;background:white;top: 50%;left: 50%;margin-top: -250px;margin-left: -175px;transition: all 1s;-moz-transition: all 1s; /* Firefox 4 */-webkit-transition: all 1s; /* Safari 和 Chrome */-o-transition: all 1s; /* Opera */} -.login-top{font-size: 24px;margin-top: 100px;padding-left: 40px;box-sizing: border-box;color: #333333;margin-bottom: 50px;font-family:"微软雅黑";font-weight:bold;color:dodgerblue} +.login-top{font-size: 24px;margin-top: 100px;text-align: center;;box-sizing: border-box;color: #333333;margin-bottom: 50px;font-family:"微软雅黑";font-weight:bold;color:dodgerblue} .login-center{width: 100%;box-sizing: border-box;padding: 0 40px;margin-bottom: 30px;} .login-center-img{width: 20px;height: 20px;float: left;margin-top: 5px;} .login-center-img>img{width: 100%;} -.login-center-input{float: left;width: 230px;margin-left: 15px;height: 30px;position: relative;} +.login-center-input{float: left;width: 80%;margin-left: 15px;height: 30px;position: relative;} .login-center-input input{z-index: 2;transition: all 0.5s;padding-left: 10px;color: #333333;width: 100%;height: 30px;border: 0;border-bottom: 1px solid #cccccc;border-top: 1px solid #ffffff;border-left: 1px solid #ffffff;border-right: 1px solid #ffffff;box-sizing: border-box;outline: none;position: relative;} .login-center-input input:focus{border: 1px solid dodgerblue;} .login-center-input-text{background: white;padding: 0 5px;position: absolute;z-index: 0;opacity: 0;height: 20px;top: 50%;margin-top: -10px;font-size: 14px;left: 5px;color: dodgerblue;line-height: 20px;transition: all 0.5s;-moz-transition: all 0.5s; /* Firefox 4 */-webkit-transition: all 0.5s; /* Safari 和 Chrome */-o-transition: all 0.5s; /* Opera */} .login-center-input input:focus~.login-center-input-text{top: 0;z-index: 3;opacity: 1;margin-top: -15px;} .login.active{-webkit-animation: login-small 0.8s ; animation: login-small 0.8s ;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards} -.login-button{cursor: pointer;width: 250px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin: 0 auto;margin-top: 50px;color: white;font-size: 18px} +.login-button{cursor: pointer;width: 80%;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;margin: 0 auto;margin-top: 50px;color: white;font-size: 18px} diff --git a/safesite/static/safesite/mystatic/js/util.js b/safesite/static/safesite/mystatic/js/util.js index 982a2f67..cae3dc06 100644 --- a/safesite/static/safesite/mystatic/js/util.js +++ b/safesite/static/safesite/mystatic/js/util.js @@ -526,7 +526,7 @@ function jsonSort(jsonObj) { } return str.substr(0, str.length - 1) } -//map定时显示,每分钟请求一次 +//map定时显示,每分钟请求一次,如果存在map function update() { if ($('#mapshowinput').length) { source.clear() @@ -571,4 +571,15 @@ function update() { }) } } -var t1 = window.setInterval(update, 1000 * 60) \ No newline at end of file +function checksession(){ +$.get('api/check_session',function(res){ + if(res.code==1){ + }else{ + $.messager.alert('','长时间未操作,请重新登陆!','warning',function(){ + window.location.reload(true) + }); + } +}) +} +var t1 = window.setInterval(update, 1000 * 60) +var t2 = window.setInterval(checksession,1000*60*31) \ No newline at end of file diff --git a/safesite/urls.py b/safesite/urls.py index 83df59f6..311468bf 100644 --- a/safesite/urls.py +++ b/safesite/urls.py @@ -155,6 +155,7 @@ urlpatterns = [ path('api/obscount',views.observepic), path('api/riskas',views.apiriskas), path('api/trainfg',views.trainfg), + path('api/check_session',views.check_session), #path('api/rights/group/',views.rightsgroup), path('api/main',views.mainapi), diff --git a/safesite/views.py b/safesite/views.py index b5224111..13f93d1c 100644 --- a/safesite/views.py +++ b/safesite/views.py @@ -26,6 +26,9 @@ import jwt import decimal from . import forms from .models import CompanyInfo +from django.contrib.sessions.models import Session +import logging +logger = logging.getLogger('log') #分页功能 def fenye(req): @@ -272,6 +275,11 @@ def check_login(func): # return JsonResponse({"code": 401, "message": "please login!"}) return warpper +def check_session(req): + if req.session.get('userid',None): + return JsonResponse({"code":1}) + else: + return JsonResponse({"code":0}) #存储文件 def upfile(req): username = User.objects.get(userid=req.session['userid']).username @@ -295,13 +303,22 @@ def login(req): if user: #比较成功,跳转index req.session['userid'] = user[0].userid - # req.session.set_expiry(60*30) + #req.session.set_expiry(10) + #登录之后获取获取最新的session_key + # session_key = req.session.session_key + #删除非当前用户session_key的记录 + # for session in Session.objects.filter(~Q(session_key=session_key), expire_date__gte=datetime.now()): + # data = session.get_decoded() + # if data.get('userid', None) == user[0].userid: + # session.delete() + logger.info('method: %s user: %s 登陆' % (req.method,user[0].userid)) return redirect('index') else: return render(req,'login.html',{'msg':'用户名或密码错误!'}) else: return render(req,'login.html') + def index(req): if not req.session.get('userid', None): return redirect('login') @@ -320,6 +337,7 @@ def logout(req): #del req.session['username'] # if "userid" in req.session: # del req.session['userid'] + logger.info('method: %s user: %s 登出' % (req.method,req.session['userid'])) req.session.flush() #req.session.flush() #req.session.delete("session_key")