Django员工管理系统

Django员工管理系统(ems)

  • 需求分析:
1.实现管理员的注册、登陆页面注册:用户名、真实名字、密码、确认密码、性别、验证码用户名需要判断是否合法、是否存在,loading图片提示密码和确认密码是否相同,loading图片提示验证码是否正确,loading图片提示点击提交时:判断信息是否正确,如错误弹窗提示,如正确,重定向到登陆页面登陆:用户名、密码、选框(记住我7天)点击提交时:判断该用户名密码是否正确,如错误弹窗提示,如正确,重定向到主页面

在这里插入图片描述
在这里插入图片描述

2.实现查看、增加、删除、修改员工信息页面查看:分页显示员工数据,下方有 上一页,页码,下一页,如没有则相应不显示点击则跳转到相应页面每条员工数据后有删除、修改 a标签,下方有增加员工信息按钮点删除,提示是否删除框,点修改,则跳转到修改页面,点增加,跳转到增加页面增加:头像、员工名、年龄、薪水,提交按钮点提交,信息添加到最后一个,并跳转到查看页面的最后一页删除:判断是否删除,如是,则删除,跳转到原查看页面注:如删除的员工为最后一个,则跳转到最后一页修改:自动获取要修改员工的信息,提交按钮提交后跳转到原查看页面注:以上页面都需要判断是否登陆成功,如果未登录,则强制登陆(跳转到登陆页面)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 前期准备
建立虚拟环境:python3.5、django2.0.6、mysql5.5.6、pip(下载第三方库的工具)、virtualenv(虚拟环境)、virtualenvwrapper(虚拟环境管理工具)、mysqlclient(Django连接数据库的第三方库)、pillow(验证码第三方包)
IDE:pycharm
navicat: 查看数据库(也可没有)
  • 创建Django项目(项目名 ems2_project)

1.创建两个APP:user、emp

	python manage.py startapp userpython manage.py startapp emp# user:管理员注册登陆# emp:员工的增删查改

2.项目setting里相关配置

	挂载app设置数据库为mysql,并添加相应配置设置session存活日期:# SESSION_EXPIRE_AT_BROWSER_CLOSE = True增加管理者头像图片所需的文件位置: /static (在项目根目录下创建:所有的静态资料都放在下面)把存放图片的文件添加到静态资源查找位置# STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

3.项目urls里相关配置

	导入app里的urls (每个app下创建自己的urls.py文件)urlpatterns = [path('admin/', admin.site.urls),path('user/', include("user.urls")),path('emp/', include("emp.urls")),]注:每个app里功能对应的url应放在app里

4.user相关功能实现

	model操作:创建User类并创建相应的属性、类型class User(models.Model):username = models.CharField(max_length=20)name = models.CharField(max_length=20)passwd = models.CharField(max_length=20)sex = models.CharField(max_length=10)创建完毕后,执行迁移命令,生成对应数据表python manage.py makemigratonspython manage.py migrate
	urls操作:先创建urls.py文件加入 app_name='user' :创建app命名空间,建立软连接再创建相应url地址:urlpatterns = [path('login/', views.login, name = 'login'),path('loginlogic/', views.loginlogic, name = 'loginlogic'),path('regist/', views.regist, name = 'regist'),path('registlogic/', views.registlogic, name = 'registlogic'),path('checkname/', views.checkname, name = 'checkname'),path('checknumber/', views.checknumber, name = 'checknumber'),path('getcaptcha/', views.getcaptcha, name = 'getcaptcha'),]注:name为各url命名空间
	view操作:(创建视图函数)注:创建相应的htnl页面注册:def regist(request):return render(request, "user/regist.html")注册相应判断:def registlogic(request):# 获取相应参数属性username = request.POST.get("username")name = request.POST.get("name")pwd = request.POST.get("pwd")repwd = request.POST.get("repwd")sex = request.POST.get("sex")number = request.POST.get("number")code = request.session.get("code")# 用户名、密码、验证码判断if code.lower() == number.lower():res = User.objects.filter(username=username)if not res and name and pwd == repwd:User.objects.create(username=username, name=name, passwd=pwd, sex=sex)return HttpResponse("1")return HttpResponse("0")注册中输入用户名之后判断:def checkname(request): ...注册中输入验证码之后判断:def checknumber(request): ...注册中的验证码显示:def getcaptcha(request):image = ImageCaptcha()code = random.sample(string.ascii_lowercase+string.ascii_uppercase+string.digits,5)random_code = ''.join(code)request.session['code'] = random_codedata = image.generate(random_code)return HttpResponse(data, "image/png")注:需要验证码相关文件 captcha登陆:def login(request):# 先判断是否有cookie值 中文需要解码username = request.COOKIES.get("username")if username:username = username.encode('latin-1').decode('utf-8')pwd = request.COOKIES.get("pwd")message = User.objects.filter(username=username, passwd=pwd)# 如cookie值正确,直接进入主页面if message:request.session['life'] = Truereturn redirect("emp:empList")# 没有或错误的cookie,进入登陆页面return render(request, "user/login.html")登陆相应判断:def loginlogic(request):# 获取用户名,密码 用户名需编码username = request.POST.get("username")pwd = request.POST.get("pwd")# 判断信息是否正确message = User.objects.filter(username=username, passwd=pwd)if username:username = username.encode('utf-8').decode('latin-1')# 如正确,则判断是否记住密码,是否设置cookieif message:res = HttpResponse("1")if request.POST.get("remeber"):res.set_cookie("username", username, max_age=7 * 24 * 3600)res.set_cookie("pwd", pwd, max_age=7 * 24 * 3600)return resreturn HttpResponse("0")

5.emp相关功能实现

	model操作:class Emp(models.Model):headpic = models.ImageField(upload_to="pics")name = models.CharField(max_length=20)salary = models.CharField(max_length=20)age = models.IntegerField()注:图片需指定存储位置,本文为 pics文件下(不需要自己创建,django会自动创建)
	urls操作:app_name = "emp"urlpatterns = [path("empList/", views.empList, name = "empList"),path("addEmp/", views.addEmp, name = "addEmp"),path("addEmpLogic/", views.addEmpLogic, name = "addEmpLogic"),path("updateEmp/", views.updateEmp, name = "updateEmp"),path("updateEmplogic/", views.updateEmplogic, name = "updateEmplogic"),path("deleteEmp/", views.deleteEmp, name="deleteEmp"),]
	view操作:(创建视图函数)主页面(查看):def empList(request):# 默认查看第一页,每页三条数据number = request.GET.get("number", 1)pagtor = Paginator(Emp.objects.all(), per_page=3)# 判断是否为增加操作,如是,需要跳转到最后一页if request.session.get("add"):number = pagtor.num_pagesrequest.session['add'] = Falsepage = pagtor.page(number)# 把页面对象传递给html页面return render(request, 'emp/emplist.html', {'emps': page})增加:def addEmp(request):return render(request, 'emp/addEmp.html')增加判断操作:def addEmpLogic(request):# 获取属性参数head_pic = request.FILES.get("head_pic")name = request.POST.get("name")salary = request.POST.get("salary")age = request.POST.get("age")# 设置图片名head_pic.name = generteUUID(head_pic.name)# 加入数据库事务try:with transaction.atomic():Emp.objects.create(headpic=head_pic, name=name, salary=salary, age=age)# 设置增加操作request.session["add"] = Truereturn redirect('emp:empList')except:return HttpResponse("添加失败")# 给图片头像设置随机文件名def generteUUID(head_pic):id = str(uuid.uuid4())extend = os.path.splitext(head_pic)[1]return id + extend修改:def updateEmp(request):# 接收对应员工的id,和对应页数id = request.GET.get("id")page = request.GET.get("number")request.session['number'] = pageemp = Emp.objects.get(id=id)return render(request, "emp/updateEmp.html", {"emp": emp})修改判断操作:def updateEmplogic(request):# 获取属性id = request.POST.get("id")head_pic = request.FILES.get("head_pic")name = request.POST.get("name")salary = request.POST.get("salary")age = request.POST.get("age")head_pic.name = generteUUID(head_pic.name)# 修改数据库中的值,保存emp = Emp.objects.get(id=id)emp.headpic = head_picemp.name = nameemp.age = ageemp.salary = salaryemp.save()# 传递页数给主页面number = request.session.get('number')url = reverse("emp:empList") + "?number=" + numberreturn redirect(url)删除:def deleteEmp(request):# 删除对应员工,传递页数id = request.GET.get("id")number = request.GET.get("number")Emp.objects.get(id=id).delete()url = reverse("emp:empList") + "?number=" + numberreturn redirect(url)

6.template(模板文件):

	1.在template下先创建相应app名文件2.在app名文件下创建html页面3.采取模板继承
	base.html:每个页面头部与尾部都是一样的,所以在父模板中渲染,如:右上角的时间<script>setInterval(function () {var time = new Date()var date = time.getFullYear() + "年" + (time.getMonth() + 1) + "月" + time.getDate() + "日" + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds()document.getElementById("time").innerHTML = date}, 1000)</script>设置多个块,供子模版渲染
	index.html:中javascript<script>{# 使用jQuery的ajax实现提交弹框 #}function login_sub() {var username = $("#username").val()var pwd = $("#pwd").val()var remeber = $("#remeber").prop("cheched")$.ajax({type: "POST",url: "{% url 'user:loginlogic' %}",data: "username=" + username + "&pwd=" + pwd + "&remeber=" + remeber +"&csrfmiddlewaretoken=" + "{{ csrf_token }}",success:function (msg) {if (msg === '1'){location.href = "{% url 'emp:empList' %}"}else {alert("用户名或密码错误!!!")}}})}</script>
	regist.html:的jquery<script>{#换一张验证码#}function change() {var url = "{% url 'user:getcaptcha' %}?" + new Date().getTime()$("#num").attr('src',url)}{#提交弹框#}function regist_sub() {var username = $("#username").val()var name = $("#name").val()var pwd = $("#pwd").val()var repwd = $("#repwd").val()var sex = $("input[name='sex']:checked").val()var number = $("#number").val()$.ajax({type:"POST",url:"{% url 'user:registlogic' %}",data:"username=" + username + "&name=" + name +"&pwd=" + pwd + "&repwd=" + repwd + "&sex=" + sex +"&number=" + number +"&csrfmiddlewaretoken=" + "{{ csrf_token }}",success:function (msg) {if (msg === '1'){location.href = "{% url 'emp:empList' %}"}else {alert("注册信息有误!!!")}}})}{#三张图片:加载、正确、错误#}var img1 = "{% static 'img/5-121204193934-50.gif' %}"var img_right = "{% static 'img/right_3.jpg' %}"var img_worry = "{% static 'img/5-140FG95153-51.gif' %}"{#显示用户名输入后 相应的loading图片#}function checkname(t) {t.nextElementSibling.src =  img1$.ajax({type: "POST",url: "{% url 'user:checkname' %}",data: "username=" + t.value + "&csrfmiddlewaretoken=" + "{{ csrf_token }}",success:function (msg) {if (msg === '1'){t.nextElementSibling.src = img_right}else {t.nextElementSibling.src = img_worry}}})}{#显示验证码输入后 相应的loading图片#}function checknumber(t) {t.nextElementSibling.src =  img1$.ajax({type: "POST",url: "{% url 'user:checknumber' %}",data: "number=" + t.value + "&csrfmiddlewaretoken=" + "{{ csrf_token }}",success:function (msg) {if (msg === '1'){t.nextElementSibling.src = img_right}else {t.nextElementSibling.src = img_worry}}})}{#显示密码输入后 相应的loading图片#}function checkpwd(t) {t.nextElementSibling.src = img1setTimeout(function () {var content = t.valueif (content.length < 5){t.nextElementSibling.src = img_worry} else {t.nextElementSibling.src = img_right}},1000)}{#显示确认密码输入后 相应的loading图片#}function checkrepwd(t) {t.nextElementSibling.src = img1setTimeout(function () {if (t.value === $("#repwd").val() && t.value !== ''){t.nextElementSibling.src = img_right} else {t.nextElementSibling.src = img_worry}},1000)}</script>
	empList.html:jquery:<script>{#删除:判断是否是最后一条数据,进行页数减一#}function del_emp(id) {if(confirm("是否删除???")){if ("{{ emps.start_index }}" === "{{ emps.end_index }}"){var number = "{{ emps.number|add:'-1' }}"}else {var number = "{{ emps.number }}"}location.href = "{% url 'emp:deleteEmp' %}?number=" + number + "&id=" + id}}</script>html:{#循环显示本页数据#}{% for emp in emps.object_list %}{# 每列交替换格式 #}{% if forloop.counter|divisibleby:'2' %}<tr class="row1">{% else %}<tr class="row2">{% endif %}{# 信息 #}<td>{{ emp.id }}</td><td><img src="{% static emp.headpic.url %}" width="50px" height="50px"></td><td>{{ emp.name }}</td><td>{{ emp.salary }}</td><td>{{ emp.age }}</td>{# 删除、修改 #}<td><a href="javascript:void(0)" onclick="del_emp({{ emp.id }})">delete_emp</a><a href="{% url 'emp:updateEmp' %}?id={{ emp.id }}&number={{ emps.number }}">update_emp</a></td></tr>{% endfor %}{# 上一页 #}{% if emps.has_previous %}<a href="{% url 'emp:empList' %}?number={{ emps.previous_page_number }}">上一页</a>{% endif %}{# 页码 #}{% for num in emps.paginator.page_range %}<a href="{% url 'emp:empList' %}?number={{ num }}"></a>{% if emps.number == num %}<span class="a">{{ num }}</span>{% else %}<span class="b">{{ num }}</span>{% endif %}{% endfor %}{# 下一页 #}{% if emps.has_next %}<a href="{% url 'emp:empList' %}?number={{ emps.next_page_number }}">下一页</a>{% endif %}

以上为创建员工管理系统全部步骤及部分重要代码。前后端全部代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(4)栈

目录 栈的知识点&#xff1a; 栈的操作&#xff1a; 创建栈&#xff1a; 压栈&#xff1a; 遍历栈&#xff1a; 判断栈是否为空&#xff1a; 出栈 清空栈 这篇笔记是根据郝斌老师的上课讲义整理而得。 栈的知识点&#xff1a; 栈的定义&#xff1a;一种可以实现"…

【LightOJ - 1104】Birthday Paradox(概率,思维)

题干&#xff1a; Sometimes some mathematical results are hard to believe. One of the common problems is the birthday paradox. Suppose you are in a party where there are 23 people including you. What is the probability that at least two people in the party…

爬虫小记

中国商标网 找到正确的入口 在此页面加入全部data数据获取xhr请求包

由浅到深理解ROS(3)-命名空间

全局命名空间&#xff1a; /rosout前面的反斜杠“/”表明该节点名称属于全局命名空间。之所以叫做全局名称因为它们在任何地方&#xff08;包括代码、命令行工具、图形界面工具等的任何地方&#xff09;都可以使用。无论这些名称用作众多命令行工具的参数还是用在节点内部&…

(5)队列

目录 队列知识点&#xff1a; 循环队列&#xff1a; 队列的操作&#xff1a; 创建队列&#xff1a; 判断队列是否已满&#xff1a; 入队&#xff1a; 遍历队列&#xff1a; 判断队列是否为空&#xff1a; 出队&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得&…

【LightOJ - 1038】Race to 1 Again(概率dp,数学期望)

题干&#xff1a; Rimi learned a new thing about integers, which is - any positive integer greater than 1 can be divided by its divisors. So, he is now playing with this property. He selects a number N. And he calls this D. In each turn he randomly choose…

使用matplotlib进行简单的数据展示

import numpy as np import matplotlib.pyplot as plt# 解决中文乱码 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号# 建立一个坐标系 plt.subplot(1, 1, 1) # 指明x和y值 x np.array([1, 2…

(6)递归

目录 递归知识点&#xff1a; 递归操作&#xff1a; 阶乘的循环实现&#xff1a; 阶乘的递归实现&#xff1a; 经典的汉诺塔问题&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得。 递归知识点&#xff1a; 定义&#xff1a;一个函数自己直接或间接调用自己 。 …

由浅到深理解ROS(4)

消息和消息类型 节点能相互传递消息&#xff0c;节点之间通信也是基于消息。消息类型也就是数据类型数据类型&#xff0c;理解消息的类型很重要&#xff0c;因为它决定了消息的内容。也就是说&#xff0c;一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息&#xff0…

【CodeForces - 1197C】Array Splitting(水题)

题干&#xff1a; You are given a sorted array a1,a2,…,ana1,a2,…,an (for each index i>1i>1 condition ai≥ai−1ai≥ai−1holds) and an integer kk. You are asked to divide this array into kk non-empty consecutive subarrays. Every element in the array…

Django项目部署在Centos7

把Django项目部署在Centos7下 先有一个Django项目 一个员工管理系统&#xff08;ems&#xff09; 员工管理系统 使用VMware创建一个虚拟的Linux系统 Centos7下安装MySql5.7 详细安装 Centos7下安装Python3.5 详细安装 Centos7下安装Django2.0.6 - 安装数据库驱动&#xf…

(7)树

目录 树的知识点&#xff1a; 定义&#xff1a; 专业术语&#xff1a; 操作(重点): 树的操作&#xff1a; 创建二叉树&#xff1a; 先序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得。 树的知识点&#xf…

由浅到深理解ROS(5)- launch启动文件的理解与编写

ROS提供了一个同时启动节点管理器&#xff08;master&#xff09;和多个节点的途径&#xff0c;即使用启动文件&#xff08;launch file&#xff09;。事实上&#xff0c;在ROS功能包中&#xff0c;启动文件的使用是非常普遍的。任何包含两个或两个以上节点的系统都可以利用启动…

【CodeForces - 1199C】MP3(思维,离散化)

题干&#xff1a; One common way of digitalizing sound is to record sound intensity at particular time moments. For each time moment intensity is recorded as a non-negative integer. Thus we can represent a sound file as an array of nn non-negative integers…

Centos7下安装MySql

1、安装方式 1.1 方式一 yum安装&#xff08;推荐使用该方式&#xff09; 在CentOS中默认安装有MariaDB&#xff0c;这个是MySQL的分支 如果必须要安装MySQL&#xff0c;首先必须添加mysql社区repo通过输入命令&#xff1a; rpm -ivh http://dev.mysql.com/get/mysql-commu…

(8)排序

排序&#xff1a; 排序和查找的关系&#xff1a;排序是查找的前提&#xff0c;排序是重点。 冒泡 插入 选择 归并排序 快速排序&#xff1a;一次确定一个数的位置 #include <stdio.h>void QuickSort(int *a, int low, int high) {int pos;if(low < high){pos FindP…

由浅到深理解ROS(6)-坐标转换

转自 ROS 中对于多坐标系的处理是使用树型表示&#xff0c;在机器人自主导航中&#xff0c;ROS会构建这几个很重要的坐标系&#xff1a; base_link: 一般位于tf tree的最根部&#xff0c;物理语义原点一般为表示机器人中心&#xff0c;为相对机器人的本体的坐标系。(base_foot…

Centos7下安装Python3.5

1、安装依赖 - yum -y install python-devel openssl-devel bzip2-devel zlib-devel expat-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel readline-devel gcc - yum -y groupinstall "Development tools"如上两步&#xff0c;汇总安装了p…

【BZOJ - 3450】Tyvj1952 Easy(数学期望,期望的线性性)

题干&#xff1a; 某一天WJMZBMR在打osu~~~但是他太弱逼了&#xff0c;有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做&#xff0c;成功了就是o&#xff0c;失败了就是x&#xff0c;分数是按comb计算的&#xff0c;连续a个comb就有a*a分&#xff0c;comb就…

吐血推荐收藏的学位论文排版教程(完整版)

目录 01.保存的高级选项设置 02.纸张设置为A4纸大小 03.设置页边距和装订线距离 04.度量衡的设置 05.创建“论文正文”样式 06.修改论文正文样式 07.设置并修改标题样式 08.给中英文摘要、附录、等大标题套用样式 09.两个Word文档之间进行并排查看 12.一键生成多级列…