• Django实战项目-学习任务系统-用户注册


    接着上期代码框架,开发第2个功能,用户注册,在原有用户模型基础上,增加一个学生用户属性表,用来关联学生用户的各种属性值,这个属性表是参考网络小说里系统属性值设计的,方便直观了解用户的能力高低,等级以及积分值等信息。

    第一步:编写第二个功能-用户注册

    1,编辑模型文件:

    ./mysite/study_system/models.py:

    1. class StudyUserAttribute(models.Model):
    2. user = models.OneToOneField(StudyUser, on_delete=models.CASCADE, primary_key=True, verbose_name='用户属性ID')
    3. study_level = models.IntegerField(verbose_name='学习级别: 1-小学,2-初中,3-高中,4-本科,5-硕士,6-博士,7-博士后')
    4. intelligence = models.IntegerField(verbose_name='智力')
    5. memory = models.IntegerField(verbose_name='记忆力')
    6. diligence = models.IntegerField(verbose_name='勤奋力')
    7. physical_fitness = models.IntegerField(verbose_name='体能')
    8. total_points = models.IntegerField(verbose_name='总积分')
    9. other_subjects = models.CharField(max_length=100, verbose_name='其他学科属性')
    10. notes = models.TextField(verbose_name='备注')
    11. update_time = models.DateTimeField(verbose_name='更新时间')
    12. class Meta:
    13. verbose_name = '学生用户属性表'
    14. verbose_name_plural = '学生用户属性表'
    15. # 用于模型的数据库表的名称
    16. db_table = "study_user_attributes"
    17. def __str__(self):
    18. return str(self.user)

    2,编辑urls配置文件:
    ./mysite/study_system/urls.py

    1. urlpatterns = [
    2. # 登录首页url
    3. path('', views.index, name='index'),
    4. path('login/', LoginView.as_view(), name='login'),
    5. # 登录主页url
    6. path('home/', views.home, name='home'),
    7. # 注册url
    8. path('register/', views.register, name='register'),
    9. ]

    3,编辑视图文件:
    ./mysite/study_system/views.py

    1. def register(request):
    2. '''
    3. @方法名称: ajax请求, 表单视图,注册用户
    4. @作 者: PandaCode辉
    5. @weixin公众号: PandaCode辉
    6. @创建时间: 2023-10-10
    7. '''
    8. # 初始化响应容器
    9. rsp_dict = {"result": "error", "errorMsg": "系统错误"}
    10. # 是否ajax请求
    11. if request.is_ajax():
    12. try:
    13. rest = request.POST
    14. # 角色:1: 系统管理员;2: 辅导员;3: 学生;4-自导自学
    15. role = rest['role']
    16. username = rest['username']
    17. password = rest['password']
    18. email = rest['email']
    19. # print('email : '+str(email))
    20. # 根据邮箱查询校验账号是否存在
    21. exists = StudyUser.is_email_exists(email)
    22. # print('exists : '+str(exists))
    23. if exists:
    24. # 用户注册校验失败,显示错误信息
    25. rsp_dict["errorMsg"] = "该邮箱已经存在注册用户,不能重复注册."
    26. # 错误返回json数据格式
    27. return JsonResponse(rsp_dict)
    28. # 手机号初始为空
    29. phone_num = ""
    30. # 辅导员用户ID,学生用户必输
    31. parent_id = 0
    32. # 今天
    33. # UTC格式当前时区时间
    34. t = time.localtime()
    35. work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
    36. print('当前日期时间:' + str(work_date))
    37. # 3: 学生,需要关联对应辅导员账号
    38. if role == '3':
    39. # 根据辅导员邮箱查询辅导员的用户信息
    40. parent_email = rest['parent_email']
    41. parent_user = StudyUser.get_user_by_email(parent_email)
    42. # print('parent_user : '+str(parent_user))
    43. if parent_user:
    44. # 找到了与邮箱匹配的用户,访问用户的属性,辅导员用户ID
    45. parent_id = parent_user.user_id
    46. else:
    47. # 没有找到与邮箱匹配的用户,执行相应的逻辑
    48. # 用户注册校验失败,显示错误信息
    49. rsp_dict["errorMsg"] = "没有找到与辅导员邮箱匹配的用户,注册失败."
    50. # 错误返回json数据格式
    51. return JsonResponse(rsp_dict)
    52. # 创建用户对象并保存到数据库
    53. user = StudyUser(role=role, username=username, password=password,
    54. email=email, phone_num=phone_num, parent_id=parent_id,
    55. created_time=work_date, update_time=work_date)
    56. # 保存用户表数据
    57. user.save()
    58. # 3: 学生;4-自导自学'。增加属性表数据
    59. if role in ('3', '4'):
    60. # 创建用户对象并保存到数据库,首次注册,所有属性值初始化为0或空
    61. userAttribute = StudyUserAttribute(user=user, study_level=1, intelligence=0, memory=0,
    62. diligence=0, physical_fitness=0,
    63. total_points=0, other_subjects="",
    64. notes="", update_time=work_date)
    65. # 保存属性表数据
    66. userAttribute.save()
    67. # 注册成功
    68. rsp_dict["result"] = "success"
    69. rsp_dict["errorMsg"] = "注册成功,请登录."
    70. # 成功返回json数据格式
    71. return JsonResponse(rsp_dict)
    72. except Exception as e:
    73. rsp_dict["errorMsg"] = "注册用户失败."
    74. # 错误返回json数据格式
    75. return JsonResponse(rsp_dict)
    76. else:
    77. # 跳转到注册页面
    78. return render(request, "study_system/register.html", rsp_dict)

    4,编辑页面模板代码:

    4.1. 用户注册页面
    ./mysite/study_system/templates/study_system/register.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>study systemtitle>
    8. <link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css">
    9. <script type="text/javascript" src="/static/study_system/jquery1.3.3/jquery.min.js">script>
    10. <style>
    11. .container {
    12. max-width: 400px;
    13. margin: 0 auto;
    14. padding-top: 100px;
    15. }
    16. style>
    17. <script type="text/javascript">
    18. /* 自动载入 */
    19. $(function () {
    20. // 清空输入栏
    21. clean_input();
    22. });
    23. // 清空输入栏
    24. function clean_input() {
    25. $("#username").val("");
    26. $("#password").val("");
    27. $("#email").val("");
    28. $("#parent_email").val("");
    29. }
    30. // 学习模式切换不同角色选择
    31. function change_study_type() {
    32. var study_type = $("select[name='study_type']").val();
    33. {#alert(study_type);#}
    34. var optionHtml = "";
    35. if (study_type == '1') {
    36. optionHtml += "<option value='4'>自导自学option>";
    37. } else {
    38. optionHtml += "<option value='2'>辅导员option>";
    39. optionHtml += "<option value='3'>学生option>";
    40. }
    41. {## 清空子元素#}
    42. $("select[name='role']").empty();
    43. // 添加到class=中
    44. $("select[name='role']").append(optionHtml);
    45. // 角色切换,显示,隐藏关联邮箱输入框
    46. change_role();
    47. // 清空输入栏
    48. clean_input();
    49. }
    50. // 角色切换,显示,隐藏关联邮箱输入框
    51. function change_role() {
    52. var role = $("select[name='role']").val();
    53. {#alert(role);#}
    54. if (role === '3') {
    55. $('#parent-email-group').show();
    56. } else {
    57. $('#parent-email-group').hide();
    58. }
    59. }
    60. //验证,用户名
    61. function check_username() {
    62. if ($("#username").val() == "") {
    63. alert("用户名,不能为空");
    64. return false;
    65. }
    66. return true;
    67. }
    68. //验证,密码
    69. function check_password() {
    70. if ($("#password").val() == "") {
    71. alert("密码,不能为空");
    72. return false;
    73. }
    74. return true;
    75. }
    76. //验证,邮箱
    77. function check_email() {
    78. if ($("#email").val() == "") {
    79. alert("邮箱,不能为空");
    80. return false;
    81. }
    82. return true;
    83. }
    84. //提交表单
    85. function submitRegister() {
    86. if (check_username() && check_password() && check_email()) {
    87. var role = $("#role").val();
    88. var username = $("#username").val();
    89. var password = $("#password").val();
    90. var email = $("#email").val();
    91. var parent_email = "";
    92. if (role == "3") {
    93. parent_email = $("#parent_email").val();
    94. }
    95. //alert("parent_email:" + parent_email);
    96. // 1,获取csrfmiddlewaretoken的input标签value属性对应的值
    97. {#var token = $('[name="csrfmiddlewaretoken"]').val();#}
    98. // 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值
    99. var csrf_token = '{{ csrf_token }}';
    100. $.post("/study_system/register/",
    101. {
    102. 'role': role,
    103. 'username': username,
    104. 'password': password,
    105. 'email': email,
    106. 'parent_email': parent_email,
    107. // 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
    108. 'csrfmiddlewaretoken': csrf_token,
    109. }, function (data) {
    110. if ("success" == data.result) {
    111. alert("注册成功");
    112. // 注册成功,去登录页面
    113. window.location.href = "/study_system/login/";
    114. } else {
    115. alert("注册失败:" + data.errorMsg);
    116. }
    117. });
    118. }
    119. }
    120. script>
    121. head>
    122. <body>
    123. <div class="container">
    124. <h2 class="text-center">注册用户h2>
    125. <form method="post" action="{% url 'study_system:register' %}">
    126. {# 在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}
    127. {% csrf_token %}
    128. <div class="form-group">
    129. <label for="study_type">学习模式label>
    130. <select class="form-control" id="study_type" name="study_type" onchange="change_study_type()">
    131. <option value="1" selected="selected">单人模式option>
    132. <option value="2">双人模式option>
    133. select>
    134. div>
    135. <div class="form-group">
    136. <label for="role">角色类型label>
    137. <select class="form-control" id="role" name="role" onchange="change_role()">
    138. {# <option value="2">辅导员option>#}
    139. {# <option value="3">学生option>#}
    140. <option value="4" selected="selected">自导自学option>
    141. select>
    142. div>
    143. <div class="form-group">
    144. <label for="username">用户名label>
    145. <input type="text" class="form-control" id="username" name="username">
    146. div>
    147. <div class="form-group">
    148. <label for="password">密码label>
    149. <input type="password" class="form-control" id="password" name="password">
    150. div>
    151. <div class="form-group">
    152. <label for="email">邮箱label>
    153. <input type="email" class="form-control" id="email" name="email">
    154. div>
    155. <div id="parent-email-group" class="form-group" style="display: none;">
    156. <label for="parent_email">关联辅导员邮箱label>
    157. <input type="email" class="form-control" id="parent_email" name="parent_email">
    158. div>
    159. <div class="form-group">
    160. <button type="button" onclick="submitRegister()" class="form-control btn-primary">注册账户button>
    161. div>
    162. <div class="form-group">
    163. <button type="reset" class="form-control btn-primary" onclick="clearErrorMessage()">重置button>
    164. div>
    165. <div class="form-group">
    166. <a href="{% url 'study_system:login' %}" class="form-control btn-link text-right">登录账户a>
    167. div>
    168. form>
    169. div>
    170. body>
    171. html>

    第二步:运行测试-用户注册功能

    1,双人模式

    1.1,先注册一个辅导员用户

      作为老师/辅导员/家长等角色,用来发布任务,配置定时任务,维护兑换物品,发放奖励物品等,监督管理学生作用,因为没有真正的智能系统,需要人工监管学生的行为规范,督促学生完成学习任务,一个辅导员可以关联多个学生用户。

    1.2,再注册一个学生用户

      作为学生角色,用来接收对应辅导员和系统发布的任务,完成任务,获取积分,兑换物品,扣除积分,拥有属性表值等,学生用户必须绑定关联一个辅导员用户。

    1,单人模式

      自己发布任务给自己,自己学习完成任务,自己维护兑换物品,自己兑换奖励物品,没有其他人监督管理,该模式需要较强的自学能力。

    -------------------------------------------------end -------------------------------------------------

  • 相关阅读:
    基于Python实现的感知机PLA人工智能实验
    CentOS下安装及配置MySQL
    docker 的数据管理
    Java实现快速排序以及原理
    SpringBoot 如何优雅的停机
    基于黏菌优化的BP神经网络(分类应用) - 附代码
    新手怎样快速上手接口测试?掌握这几个知识点直接起飞!
    前后端分离项目的https加密解密过程一、从https说起
    回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)
    LeetCode每日一题——895. 最大频率栈
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/133748711