定制app开发基于Django简单实现一个员工管理系统

定制app开发这是框架从入门到精通(定制app开发第四章用户管理)内附源码

文章目录

  • 目录


 前言:

定制app开发经过前期的学习,定制app开发我们掌握了最基本的用法,定制app开发这期将把后面的知识点全部使用,定制app开发只给大家简单说一下,定制app开发具体知识点还是按流程来,定制app开发给大家看一下成品:

定制app开发这就是我们学习完之后的知识点,能做出来的,这个页面有些不太好看,我们可以用css来修饰,给大家看我的:

  • 建立数据库,并创建表: 

  1. from django.db import models
  2. # 部门类
  3. class Department(models.Model):
  4. title = models.CharField(verbose_name='标题', max_length=32)
  5. def __str__(self):
  6. return self.title
  7. # 员工类
  8. class UserInfo(models.Model):
  9. name = models.CharField(verbose_name='姓名', max_length=16)
  10. password = models.CharField(verbose_name='密码', max_length=64)
  11. age = models.IntegerField(verbose_name='年龄')
  12. account = models.DecimalField(verbose_name='余额', max_digits=10, decimal_places=2, default=0)
  13. create_time = models.DateField(verbose_name='入职时间')
  14. # to与哪张表关联
  15. # to_field 表中的哪一列关联
  16. # Django 自动后面生成_id
  17. # 若部门删除
  18. # 1)级联删除 on_delete=models.CASCADE
  19. # 2) 置空 null=ture black=ture
  20. depart = models.ForeignKey(verbose_name="部门", to="Department", to_field="id", on_delete=models.CASCADE)
  21. gender_choices = (
  22. (1, "男"),
  23. (2, "女"),
  24. )
  25. gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
  26. # 管理员类
  27. class Admin(models.Model):
  28. username = models.CharField(verbose_name="用户名", max_length=32)
  29. password = models.CharField(verbose_name="密码", max_length=64)

 这里涉及到了主键约束,和级联删除,代码中有注释

  • 建立url:

  1. urlpatterns = [
  2. # path('admin/', admin.site.urls),
  3. path('depart/list/', views.depart_list),
  4. path('uesr/model/form/add/', views.user_model_form_add),
  5. path('main/page/', views.main_page),
  6. # 将id传递
  7. path('user/<int:nid>/edit/', views.user_edit),
  8. path('user/<int:nid>/data/', views.user_data),
  9. path('admin/list/', views.admin_list),
  10. path('admin/add/', views.admin_add),
  11. path('admin/<int:nid>/edit/', views.admin_edit),
  12. path('admin/<int:nid>/delet/', views.admin_delet),
  13. path('admin/<int:nid>/edit/password/', views.admin_edit_password),
  14. path('admin/login/', views.login),
  15. path('admin/logout/', views.logout)
  16. ]

这些都是url与函数的对应关系。

  • 主函数views.py

 首先给大家看我我们要导入的模块

  1. # 导入forms模块
  2. from django import forms
  3. # 导入正则表达式
  4. from django.core.validators import RegexValidator
  5. # 导入自己设置报错模块
  6. from django.core.exceptions import ValidationError
  7. # 导入django自带的md5加密的盐
  8. from django.conf import settings
  9. # 导入中间件
  10. from django.utils.deprecation import MiddlewareMixin
  •  定义md5方法将数据库加密

  1. # 运用md5将数据库密码加密
  2. def md5(data_string):
  3. obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))
  4. obj.update(data_string.encode('utf-8'))
  5. return obj.hexdigest()
  •  定义bootstrap类

  1. # 定义bootstrap类
  2. class BootStrapModelForm(forms.ModelForm):
  3. # 定义init方法
  4. def __init__(self, *args, **kwargs):
  5. # 执行父类的init方法
  6. super().__init__(*args, **kwargs)
  7. # 循环modelform每一个字段,设置字段的插件
  8. for name, field in self.fields.items():
  9. if field.widget.attrs:
  10. # 若字典内有值
  11. field.widget.attrs["class"] = "form-control"
  12. else:
  13. # 若字典内有值
  14. field.widget.attrs = {"class": "form-control"}
  •  定义中间件

  1. # 定义中间件
  2. class AuthMiddleWare(MiddlewareMixin):
  3. def process_request(self, request):
  4. # 排除不需要登陆就可以访问的页面
  5. if request.path_info == "/admin/login/":
  6. return
  7. # 读取访问用户的session信息
  8. info_dict = request.session.get("info")
  9. if info_dict:
  10. return
  11. # 若没登陆去登录页面
  12. return redirect('/admin/login/')
  • 定义modelform类并继承bootstrap类  

  1. # 继承bootstrap类
  2. class UserModelForm(BootStrapModelForm):
  3. name = forms.CharField(min_length=2,
  4. label="用户名",
  5. # validators=正则表达式(方式一)
  6. # validators=RegexValidator())
  7. )
  8. # 正则表达式
  9. RegexValidator()
  10. class Meta:
  11. model = models.UserInfo
  12. fields = ["name", "password", "age", "account", "create_time", "depart", "gender"]
  13. # 方式2(定义钩子方法)
  14. def clean_name(self):
  15. txt_name = self.cleaned_data["name"]
  16. # 钩子方法校验
  17. if len(txt_name) > 10:
  18. raise ValidationError("格式错误")
  19. # 验证通过返回(必须这样写)
  20. return txt_name
  •  定义管理员modelform类,并继承bootstrap类

  1. # 定义新的modelform管理员密码类
  2. # 并继承Bootstrap父类
  3. class AdminEditPasswordModelForm(BootStrapModelForm):
  4. confirm_password = forms.CharField(label="确认密码", widget=forms.PasswordInput(render_value=True))
  5. class Meta:
  6. model = models.Admin
  7. fields = ['password', 'confirm_password']
  8. def clean_password(self):
  9. # 获得用户输入的密码
  10. pwd = self.cleaned_data.get("password")
  11. # 用md5将数据加密
  12. md5_pwd = md5(pwd)
  13. # 在数据库中搜索id,password
  14. exists = models.Admin.objects.filter(id=self.instance.pk, password=md5_pwd).exists()
  15. if exists:
  16. raise ValidationError("重置的密码不能与之前的相同")
  17. return md5_pwd
  18. def clean_confirm_password(self):
  19. pwd = self.cleaned_data.get("password")
  20. confirm = md5(self.cleaned_data.get("confirm_password"))
  21. if confirm != pwd:
  22. raise ValidationError("账号密码不一致")
  23. return confirm
  •  员工类代码-增删改查

  1. # 员工主页面
  2. def main_page(request):
  3. # 去数据库中拿到所有信息
  4. model_user_info = models.UserInfo.objects.all()
  5. # 建数据库中信息传入前端
  6. return render(request, 'main_page.html', {"objects": model_user_info})
  7. # 员工存储页面
  8. def user_model_form_add(request):
  9. # 用户访问get方式
  10. if request.method == "GET":
  11. form = UserModelForm()
  12. return render(request, 'user_model_form_add.html', {"form": form})
  13. # 用户post请求提交数据,校验数据
  14. form = UserModelForm(data=request.POST)
  15. if form.is_valid():
  16. # 校验正确存入库
  17. form.save()
  18. return redirect('/main/page/')
  19. else:
  20. return render(request, 'user_model_form_add.html', {"form": form})
  21. # 编辑员工信息
  22. def user_edit(request, nid):
  23. row_object = models.UserInfo.objects.filter(id=nid).first()
  24. if request.method == "GET":
  25. form = UserModelForm(instance=row_object)
  26. return render(request, 'user_edit.html', {"form": form})
  27. elif request.method == "POST":
  28. form = UserModelForm(data=request.POST, instance=row_object)
  29. if form.is_valid():
  30. form.save()
  31. # 重定向回主页面
  32. return redirect('/main/page')
  33. return render(request, 'user_edit.html', {"form": form})
  34. # 删除员工信息
  35. def user_data(request, nid):
  36. models.UserInfo.objects.filter(id=nid).delete()
  37. # 删除后重定向
  38. return redirect('/main/page')
  •  管理员类增删改查

  1. # 管理员列表
  2. def admin_list(request):
  3. queryset = models.Admin.objects.all()
  4. return render(request, 'admin_list.html', {"queryset": queryset})
  5. # 新建管理员
  6. def admin_add(request):
  7. title = "新建管理员"
  8. if request.method == "GET":
  9. form = AdminModelForm()
  10. return render(request, 'admin_add.html', {'form': form, 'title': title})
  11. form = AdminModelForm(data=request.POST)
  12. if form.is_valid():
  13. form.save()
  14. return redirect('/admin/list/')
  15. return render(request, 'admin_add.html', {'form': form, "title": title})
  16. # 编辑管理员
  17. def admin_edit(request, nid):
  18. title = "管理员编辑表"
  19. row_object = models.Admin.objects.filter(id=nid).first()
  20. if not row_object:
  21. return redirect('/admin/list/')
  22. # get请求
  23. if request.method == 'GET':
  24. form = AdminModelForm(instance=row_object)
  25. return render(request, 'admin_edit.html', {"title": title, "queryset": form})
  26. # post请求保存到数据库
  27. elif request.method == "POST":
  28. form = AdminModelForm(data=request.POST, instance=row_object)
  29. if form.is_valid():
  30. # 校验正确保存到数据库
  31. form.save()
  32. return redirect('/admin/list/')
  33. return render(request, 'admin_edit.html', {"queryset": form})
  34. # 删除管理员
  35. def admin_delet(request, nid):
  36. models.Admin.objects.filter(id=nid).delete()
  37. # 重定向回列表页面
  38. return redirect('/admin/list/')
  39. # 重置密码
  40. def admin_edit_password(request, nid):
  41. row_object = models.Admin.objects.filter(id=nid).first()
  42. if not list:
  43. return redirect('/admin/list/')
  44. title = '重置管理员密码----{}'.format(row_object.username)
  45. if request.method == "GET":
  46. form = AdminEditPasswordModelForm(instance=row_object)
  47. return render(request, 'admin_edit_password.html', {"queryset": form, "title": title})
  48. elif request.method == "POST":
  49. form = AdminEditPasswordModelForm(data=request.POST, instance=row_object)
  50. if form.is_valid():
  51. form.save()
  52. return redirect('/admin/list/')
  53. return render(request, 'admin_edit_password.html', {"queryset": form, "title": title})
  54. # 管理员登录类
  55. class LoginForm(forms.Form):
  56. username = forms.CharField(label="用户名", widget=forms.TextInput, required=True)
  57. password = forms.CharField(label="密码", widget=forms.PasswordInput(render_value=True), required=True)
  58. def clean_password(self):
  59. pwd = self.cleaned_data.get("password")
  60. return md5(pwd)
  61. # 管理员登录界面
  62. def login(request):
  63. if request.method == "GET":
  64. form = LoginForm()
  65. return render(request, 'login.html', {"form": form})
  66. elif request.method == "POST":
  67. form = LoginForm(data=request.POST)
  68. if form.is_valid():
  69. # 去数据库校验账号和密码,获取用户对象
  70. admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
  71. if not admin_object:
  72. # 主动添加错误
  73. form.add_error("password", "用户名或密码不正确")
  74. return render(request, 'login.html', {"form": form})
  75. # 进行cookie认证和session
  76. # 若正确,网站生成随机字符串,写到用户的浏览器cookie中,再写到session中
  77. else:
  78. # 写入session中
  79. request.session["info"] = {"id": admin_object.id, "name": admin_object.username}
  80. # 登录成功进行重定向
  81. return redirect('/main/page/')
  82. return render(request, 'login.html', {"form": form})
  83. # 注销登录
  84. def logout(request):
  85. request.session.clear()
  86. return redirect('/admin/login')

 这就是views的所有代码,给大家看一下前端的代码

 首先:

  • 管理员添加html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <div class="panel panel-default">
  10. <div>
  11. <h1> {{ title }}注册表</h1>
  12. </div>
  13. <form method="post" novalidate>
  14. <fieldset>
  15. {% csrf_token %}
  16. {% for iteam in form %}
  17. <div class="form-group">
  18. {{ iteam.label }}: {{ iteam }}<br><br>
  19. <span style="color: red"> {{ iteam.errors.0 }}</span>
  20. </div>
  21. {% endfor %}
  22. <button type="submit" class="btn btn-primary">
  23. 提交
  24. </button>
  25. </fieldset>
  26. </form>
  27. </div>
  28. </div>
  29. </body>
  30. </html>
  •  修改管理员信息html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <div class="panel panel-default">
  10. <div>
  11. <h1> {{ title }}</h1>
  12. </div>
  13. <form method="post" novalidate>
  14. <fieldset>
  15. {% csrf_token %}
  16. {% for iteam in queryset %}
  17. <div class="form-group">
  18. {{ iteam.label }}: {{ iteam }}<br><br>
  19. <span style="color: red"> {{ iteam.errors.0 }}</span>
  20. </div>
  21. {% endfor %}
  22. <button type="submit" class="btn btn-primary">
  23. 提交
  24. </button>
  25. </fieldset>
  26. </form>
  27. </div>
  28. </div>
  29. </body>
  30. </html>

 修改管理员密码html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <div class="panel panel-default">
  10. <div>
  11. <h1> {{ title }}</h1>
  12. </div>
  13. <form method="post" novalidate>
  14. <fieldset>
  15. {% csrf_token %}
  16. {% for iteam in queryset %}
  17. <div class="form-group">
  18. {{ iteam.label }}: {{ iteam }}<br><br>
  19. <span style="color: red"> {{ iteam.errors.0 }}</span>
  20. </div>
  21. {% endfor %}
  22. <button type="submit" class="btn btn-primary">
  23. 提交
  24. </button>
  25. </fieldset>
  26. </form>
  27. </div>
  28. </div>
  29. </body>
  30. </html>
  • 管理员页面html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <a class="btn btn-success" href="/admin/add/">新建管理员</a>
  9. <table border="1" width="900px"> <!--border:表格边框,width:表格宽度-->
  10. <caption>管理员中心</caption> <!--标题标签,居中显示,仅有一个标题-->
  11. <tr>
  12. <th>id</th>
  13. <th>姓名</th> <!--th标签:表格头,内容居中,加粗显示-->
  14. <th>密码</th>
  15. <th>密码操作</th>
  16. <th>操作</th>
  17. </tr>
  18. {% for obj in queryset %}
  19. <tr>
  20. <td> {{ obj.id }}</td>
  21. <td>{{ obj.username }}</td> <!--td标签:普通表格,内容左对齐-->
  22. <td>*********</td>
  23. <td><a class="btn btn-success" href="/admin/{{ obj.id }}/edit/password/">重置密码</a></td>
  24. <td>
  25. <a class="btn-primary btn-xs" href="/admin/{{ obj.id }}/edit/">编辑</a>
  26. <a class="btn-danger btn-ns" href="/admin/{{ obj.id }}/delet/">删除</a>
  27. {% endfor %}
  28. </td>
  29. </tr>
  30. </table>
  31. </body>
  32. </html>
  •  登录页面的html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. body {
  9. background: url('https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.jpg') no-repeat;
  10. background-size: 100% 130%;
  11. }
  12. #login_box {
  13. width: 20%;
  14. height: 400px;
  15. background-color: #00000060;
  16. margin: auto;
  17. margin-top: 10%;
  18. text-align: center;
  19. border-radius: 10px;
  20. padding: 50px 50px;
  21. }
  22. h2 {
  23. color: #ffffff90;
  24. margin-top: 5%;
  25. }
  26. #input-box {
  27. margin-top: 5%;
  28. }
  29. span {
  30. color: #fff;
  31. }
  32. input {
  33. border: 0;
  34. width: 60%;
  35. font-size: 30px;
  36. color: #fff;
  37. background: transparent;
  38. border-bottom: 6px solid #fff;
  39. padding: 5px 10px;
  40. outline: none;
  41. margin-top: 10px;
  42. }
  43. button {
  44. margin-top: 50px;
  45. width: 60%;
  46. height: 30px;
  47. border-radius: 10px;
  48. border: 0;
  49. color: #fff;
  50. text-align: center;
  51. line-height: 30px;
  52. font-size: 15px;
  53. background-image: linear-gradient(to right, #30cfd0, #330867);
  54. }
  55. #sign_up {
  56. margin-top: 45%;
  57. margin-left: 60%;
  58. }
  59. a {
  60. color: #b94648;
  61. }
  62. </style>
  63. </head>
  64. <body>
  65. <form method="post" novalidate>
  66. {% csrf_token %}
  67. <div id="login_box">
  68. <h2>管理员登录</h2>
  69. <div id="input_box">
  70. {{ form.username.label }}:{{ form.username }}<br><br>
  71. <span style="color: red">{{ form.username.errors.0 }}</span>
  72. </div>
  73. <div class="input_box">
  74. {{ form.password.label }}:{{ form.password }}<br><br>
  75. <span style="color: red">{{ form.password.errors.0 }}</span>
  76. </div>
  77. <button type="submit">登录</button>
  78. <br>
  79. </div>
  80. </form>
  81. </body>
  82. </html>
  •  部门添加页面html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. {% csrf_token %}
  10. <label><input class="text" name="title" value="请添加部门"/> 部门名称</label>
  11. <button type="submit" class="btn btn-primary">
  12. 提交
  13. </button>
  14. </form>
  15. </body>
  16. </html>
  •  员工主页面html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style type="text/css">
  7. li {
  8. display: inline;
  9. list-style: none;
  10. margin: 0 20px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <nav class="pageNav">
  16. <ul class="list">
  17. <li><a href="/main/page/" target="_blank"><span>员工管理</span></a></li>
  18. <li><a href="/admin/list/" target="_blank"><span>管理员管理</span></a></li>
  19. <li><a href="/admin/logout/" target="_blank"><span>注销</span></a></li>
  20. {# <li><a href="#" target="_blank"><span>联系我们</span></a></li>#}
  21. <li><a href="#" target="_blank"><span>{{ request.session.info.name }}</span></a></li>
  22. </ul>
  23. </nav>
  24. <a class="btn btn-success" href="/uesr/model/form/add/">新建员工</a>
  25. <table border="1" width="900px"> <!--border:表格边框,width:表格宽度-->
  26. <caption>用户信息中心</caption> <!--标题标签,居中显示,仅有一个标题-->
  27. <tr>
  28. <th>id</th>
  29. <th>姓名</th> <!--th标签:表格头,内容居中,加粗显示-->
  30. <th>密码</th>
  31. <th>年龄</th>
  32. <th>余额</th>
  33. <th>入职时间</th>
  34. <th>性别</th>
  35. <th>部门</th>
  36. <th>操作</th>
  37. </tr>
  38. {% for obj in objects %}
  39. <tr>
  40. <td> {{ obj.id }}</td>
  41. <td>{{ obj.name }}</td> <!--td标签:普通表格,内容左对齐-->
  42. <td>{{ obj.password }}</td>
  43. <td>{{ obj.age }}</td>
  44. <td>{{ obj.account }}</td>
  45. <td>{{ obj.create_time|date:"Y-m-d" }}</td>
  46. <td>{{ obj.get_gender_display }}</td>
  47. <td>{{ obj.depart.title }}</td>
  48. <td>
  49. <a class="btn-primary btn-xs" href="/user/{{ obj.id }}/edit/">编辑</a>
  50. <a class="btn-danger btn-ns" href="/user/{{ obj.id }}/data/">删除</a>
  51. </td>
  52. </tr>
  53. {% endfor %}
  54. </table>
  55. </body>
  56. </html>
  •  员工添加html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <div class="panel panel-default">
  10. <div>
  11. <h1> 编辑用户</h1>
  12. </div>
  13. <form method="post" novalidate>
  14. <fieldset>
  15. {% csrf_token %}
  16. {% for iteam in form %}
  17. <div class="form-group">
  18. {{ iteam.label }}: {{ iteam }}<br><br>
  19. <span style="color: red"> {{ iteam.errors.0 }}</span>
  20. </div>
  21. {% endfor %}
  22. <button type="submit" class="btn btn-primary">
  23. 提交
  24. </button>
  25. </fieldset>
  26. </form>
  27. </div>
  28. </div>
  29. </body>
  30. </html>
  •  员工注册html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <div class="panel panel-default">
  10. <div>
  11. <h1> 用户管理系统注册表</h1>
  12. </div>
  13. <form method="post" novalidate>
  14. <fieldset>
  15. {% csrf_token %}
  16. {% for iteam in form %}
  17. <div class="form-group">
  18. {{ iteam.label }}: {{ iteam }}<br><br>
  19. <span style="color: red"> {{ iteam.errors.0 }}</span>
  20. </div>
  21. {% endfor %}
  22. <button type="submit" class="btn btn-primary">
  23. 提交
  24. </button>
  25. </fieldset>
  26. </form>
  27. </div>
  28. </div>
  29. </body>
  30. </html>

 以上就是该程序的所有代码,只有登陆页面加了css


总结:

以上就是本期的分享,在后续的文章中给大家说明原理,并且代码内附注释,我们下期见

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发