#!/usr/bin/python
# -*- coding:utf-8 -*-
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext
from django.contrib import messages
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render_to_response
from django.conf import settings
from cStringIO import StringIO
from library.common import paging
from system.models import UserProfile
from system.forms import *
from users.models import Users
import pyotp
import qrcode
def super_user_required(login_url='/error_403'):
"""
check permission
:param login_url:
:return:
"""
return user_passes_test(lambda u: u.is_superuser, login_url=login_url)
def user_login(request):
"""
用户登录视图
:param request:
:return:
"""
callback = request.REQUEST.get('next', '')
response = HttpResponseRedirect(callback) if callback != '' else HttpResponseRedirect('/')
if request.method == 'POST':
form = UserLoginForm(request.POST)
if form.is_valid():
rs, msg = False, '用户不存在/密码错误!'
cd = form.cleaned_data
# 验证账号密码
user = authenticate(username=cd['username'], password=cd['password'])
if user:
# 验证OTP
try:
key = user.profile.otp
if settings.ARCHER_ENABLE_OTP and cd['otp'] and len(cd['otp']) == 6:
if not pyotp.TOTP(key).verify(cd['code']):
msg = '错误:动态口令验证失败!'
else:
login(request, user)
rs = True, '登录成功!'
except Exception, e:
UserProfile(user=user, otp=pyotp.random_base32(), avatar='').save() # 追加otp
msg = e.message
if rs:
messages.add_message(request, messages.SUCCESS, msg)
else:
messages.add_message(request, messages.ERROR, msg)
response = HttpResponseRedirect(reverse('system:system_user_login'))
return response
else:
return response if request.user.is_authenticated() else render_to_response('system/login.html', {
'enable_otp': settings.ARCHER_ENABLE_OTP}, context_instance=RequestContext(request))
@login_required(login_url='/system/u/login/')
def user_logout(request):
"""
用户注销
:param request:
:return:
"""
logout(request)
return HttpResponseRedirect(reverse('system:system_user_login'))
@login_required(login_url='/system/u/login/')
def user_change_password(request):
"""
修改用户密码
:param request:
:return:
"""
if request.method == 'POST':
form = UserChangePasswordForm(request.POST)
rs, msg = False, '密码修改失败'
if form.is_valid():
form_data = form.cleaned_data
new_password1 = form_data['new_password1']
new_password2 = form_data['new_password2']
if new_password1 == '' or new_password2 == '':
msg = "密码/otp_code不允许为空"
elif new_password1 != new_password2:
msg = "两次密码不一致"
elif len(new_password1) < 6:
msg = "密码必须大于六位"
elif new_password1 == new_password2:
request.user.set_password(new_password1)
request.user.save()
rs, msg = True, "修改成功"
else:
msg = "未知错误"
if rs:
messages.add_message(request, messages.SUCCESS, msg)
else:
messages.add_message(request, messages.ERROR, msg)
else:
messages.add_message(request, messages.ERROR, '密码不为空!')
return HttpResponseRedirect(reverse('system:system_user_change_password'))
else:
return render_to_response('system/change_password.html', {'userinfo': User.objects.get(pk=request.user.id)},
context_instance=RequestContext(request))
@login_required(login_url='/system/u/login/')
@super_user_required(login_url="/error_403")
def user_list(request):
"""
User list
:param request:
:return:
"""
page = int(request.REQUEST.get('page', 1))
data = User.objects.all().order_by('id')
data, page_range = paging(page, data, 40)
return render_to_response('system/user_list.html', {'data': data, 'page_range': page_range},
context_instance=RequestContext(request))
@login_required(login_url='/system/u/login/')
def user_profile(request):
"""
User Profile
:param request:
:return:
"""
return render_to_response('system/profile.html', {}, context_instance=RequestContext(request))
@login_required(login_url='/system/u/login/')
@super_user_required(login_url="/error_403")
def user_add(request):
if request.method == 'POST':
username = request.POST.get('username', '')
first_name = request.POST.get('first_name', '')
last_name = request.POST.get('last_name', '')
email = request.POST.get('email', '')
password = request.POST.get('password', '')
group = request.POST.get('group', '')
permission = request.POST.getlist('permission')
user = User.objects.filter(username=username)
if not user:
u = User.objects.create_user(username, email, password)
u.last_name = last_name
u.first_name = first_name
u.groups = group
u.user_permissions = permission
u.save()
p = UserProfile(user=u, otp=pyotp.random_base32(), avatar='')
p.save()
msg = '创建成功'
res = True
else:
msg = '用户已经存在'
res = False
if res:
messages.add_message(request, messages.SUCCESS, msg)
return HttpResponseRedirect(reverse('system:system_user_list'))
else:
messages.add_message(request, messages.ERROR, msg)
return HttpResponseRedirect(reverse('system:system_user_add'))
else:
groups = Group.objects.all()
perms = Permission.objects.all()
return render_to_response('system/create.html',
{'groups': groups, 'perms': perms},
context_instance=RequestContext(request))
@login_required(login_url='/system/u/login/')
@super_user_required(login_url="/error_403")
def user_edit(request, uid):
if request.method == 'POST':
uid = request.POST.get('uid', '')
first_name = request.POST.get('first_name', '')
last_name = request.POST.get('last_name', '')
email = request.POST.get('email', '')
group = request.POST.get('group', '')
permission = request.POST.getlist('permission')
try:
u = User.objects.get(pk=uid)
u.first_name = first_name
u.last_name = last_name
u.email = email
u.groups = group
u.user_permissions = permission
u.save()
res, msg = True, '用户:' + str(uid) + '修改成功!'
except User.DoesNotExist:
res, msg = False, '用户:' + str(uid) + '不存在!'
if res:
messages.add_message(request, messages.SUCCESS, msg)
else:
messages.add_message(request, messages.SUCCESS, msg)
return HttpResponseRedirect(reverse('system:system_user_list'))
else:
data = User.objects.get(pk=ui
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: 用于学校或教育机构的学生信息、教职员工信息、课程管理、成绩记录、考勤管理等。学校管理系统帮助提高学校的组织效率和信息管理水平。 人力资源管理系统(HRM): 用于处理组织内的人事信息,包括员工招聘、培训记录、薪资管理、绩效评估等。HRM系统有助于企业更有效地管理人力资源,提高员工的工作效率和满意度。 库存管理系统: 用于追踪和管理商品或原材料的库存。这种系统可以帮助企业避免库存过剩或不足的问题,提高供应链的效率。 客户关系管理系统(CRM): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。CRM系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者信息、医生排班、药品库存等。这种系统可以提高医疗服务的质量和效率。 财务管理系统: 用于记录和管理组织的财务信息,包括会计凭证、财务报表、预算管理等。财务管理系统
资源推荐
资源详情
资源评论
收起资源包目录
单点登录系统(简易版),因为存在多个系统,各个系统都有用户管理,所以特意将它独立出来!.zip (458个子文件)
style.css 167KB
summernote-bs3.css 143KB
bootstrap.min.css 118KB
bootstrap.min14ed.css 118KB
style.min.css 97KB
style.min862f.css 97KB
animate.css 64KB
animate.min.css 46KB
datepicker3.css 33KB
font-awesome.min93e3.css 26KB
ambiance.css 25KB
style.min.css 25KB
sweetalert.css 18KB
simditor.css 17KB
ui.jqgridffe4.css 16KB
base.css 14KB
jasny-bootstrap.min.css 14KB
chosen.css 12KB
dropzone.css 11KB
layer.css 11KB
layim.css 11KB
fullcalendar.css 11KB
widgets.css 10KB
summernote.css 10KB
plyr.css 10KB
codemirror.css 7KB
blueimp-gallery.min.css 7KB
awesome-bootstrap-checkbox.css 7KB
toastr.min.css 7KB
forms.css 6KB
laydate.css 6KB
webuploader-demo.min.css 6KB
laydate.css 6KB
jquery.steps.css 6KB
footable.core.css 5KB
changelists.css 5KB
jquery.fancybox.css 5KB
dataTables.bootstrap.css 5KB
bootstrap-table.min.css 4KB
rtl.css 4KB
clockpicker.css 4KB
basic.css 4KB
style.css 4KB
laydate.css 3KB
bootstrap-colorpicker.min.css 3KB
laydate.css 3KB
laydate.css 3KB
laydate.css 3KB
laydate.css 3KB
laydate.css 3KB
cropper.min.css 3KB
ion.rangeSlider.css 3KB
jquery.nouislider.css 3KB
layer.ext.css 3KB
bootstrap-markdown.min.css 3KB
jquery.gritter.css 3KB
ion.rangeSlider.skinFlat.css 2KB
bootstrap-duallistbox.css 2KB
login.min.css 1KB
custom.css 1KB
ie.css 1KB
bootstrap-treeview.css 1KB
login.css 940B
fullcalendar.print.css 660B
switchery.css 611B
webuploader.css 515B
morris-0.4.3.min.css 443B
dashboard.css 434B
fontawesome-webfontd41d.eot 67KB
fontawesome-webfont93e3.eot 67KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regulard41d.eot 20KB
footable.eot 5KB
footabled41d.eot 5KB
.eslintignore 16B
.eslintrc 4KB
[email protected] 14KB
fancybox_loading.gif 6KB
loading.gif 4KB
selector-icons.gif 3KB
loading.gif 2KB
loading-upload.gif 2KB
default-bg.gif 836B
default-bg-reverse.gif 835B
selector-search.gif 552B
icon_clock.gif 390B
sorting-icons.gif 369B
icon_success.gif 341B
icon_error.gif 319B
icon-yes.gif 299B
nav-bg.gif 265B
nav-bg-selected.gif 265B
icon_calendar.gif 192B
icon_deletelink.gif 181B
nav-bg-reverse.gif 178B
icon-no.gif 176B
loading.gif 166B
icon_alert.gif 145B
icon-unknown.gif 130B
icon_addlink.gif 119B
共 458 条
- 1
- 2
- 3
- 4
- 5
资源评论
JJJ69
- 粉丝: 6222
- 资源: 5780
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- VID20240521070643.mp4
- Android系统原理与开发学习要点详解-培训课件.zip
- 部署yolov8的tensorrt模型支持检测分割姿态估计的C++源码+部署步骤.zip
- 以简单、易用、高性能为目标、开源的时序数据库,支持Linux及Windows, Time Series Database.zip
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功