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

news2024/11/15 5:55:26

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

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

1,编辑模型文件:

./mysite/study_system/models.py:

class StudyUserAttribute(models.Model):
    user = models.OneToOneField(StudyUser, on_delete=models.CASCADE, primary_key=True, verbose_name='用户属性ID')
    study_level = models.IntegerField(verbose_name='学习级别: 1-小学,2-初中,3-高中,4-本科,5-硕士,6-博士,7-博士后')
    intelligence = models.IntegerField(verbose_name='智力')
    memory = models.IntegerField(verbose_name='记忆力')
    diligence = models.IntegerField(verbose_name='勤奋力')
    physical_fitness = models.IntegerField(verbose_name='体能')
    total_points = models.IntegerField(verbose_name='总积分')
    other_subjects = models.CharField(max_length=100, verbose_name='其他学科属性')
    notes = models.TextField(verbose_name='备注')
    update_time = models.DateTimeField(verbose_name='更新时间')

    class Meta:
        verbose_name = '学生用户属性表'
        verbose_name_plural = '学生用户属性表'
        # 用于模型的数据库表的名称
        db_table = "study_user_attributes"

    def __str__(self):
        return str(self.user)

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

urlpatterns = [
    # 登录首页url
    path('', views.index, name='index'),
    path('login/', LoginView.as_view(), name='login'),
    # 登录主页url
    path('home/', views.home, name='home'),
    # 注册url
    path('register/', views.register, name='register'),
]

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

def register(request):
    '''
    @方法名称: ajax请求, 表单视图,注册用户
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-10-10
    '''
    # 初始化响应容器
    rsp_dict = {"result": "error", "errorMsg": "系统错误"}
    # 是否ajax请求
    if request.is_ajax():
        try:
            rest = request.POST
            # 角色:1: 系统管理员;2: 辅导员;3: 学生;4-自导自学
            role = rest['role']
            username = rest['username']
            password = rest['password']
            email = rest['email']
            # print('email : '+str(email))
            # 根据邮箱查询校验账号是否存在
            exists = StudyUser.is_email_exists(email)
            # print('exists : '+str(exists))
            if exists:
                # 用户注册校验失败,显示错误信息
                rsp_dict["errorMsg"] = "该邮箱已经存在注册用户,不能重复注册."
                # 错误返回json数据格式
                return JsonResponse(rsp_dict)
            # 手机号初始为空
            phone_num = ""
            # 辅导员用户ID,学生用户必输
            parent_id = 0
            # 今天
            # UTC格式当前时区时间
            t = time.localtime()
            work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
            print('当前日期时间:' + str(work_date))
            # 3: 学生,需要关联对应辅导员账号
            if role == '3':
                # 根据辅导员邮箱查询辅导员的用户信息
                parent_email = rest['parent_email']
                parent_user = StudyUser.get_user_by_email(parent_email)
                # print('parent_user : '+str(parent_user))
                if parent_user:
                    # 找到了与邮箱匹配的用户,访问用户的属性,辅导员用户ID
                    parent_id = parent_user.user_id
                else:
                    # 没有找到与邮箱匹配的用户,执行相应的逻辑
                    # 用户注册校验失败,显示错误信息
                    rsp_dict["errorMsg"] = "没有找到与辅导员邮箱匹配的用户,注册失败."
                    # 错误返回json数据格式
                    return JsonResponse(rsp_dict)

            # 创建用户对象并保存到数据库
            user = StudyUser(role=role, username=username, password=password,
                             email=email, phone_num=phone_num, parent_id=parent_id,
                             created_time=work_date, update_time=work_date)
            # 保存用户表数据
            user.save()
            # 3: 学生;4-自导自学'。增加属性表数据
            if role in ('3', '4'):
                # 创建用户对象并保存到数据库,首次注册,所有属性值初始化为0或空
                userAttribute = StudyUserAttribute(user=user, study_level=1, intelligence=0, memory=0,
                                                   diligence=0, physical_fitness=0,
                                                   total_points=0, other_subjects="",
                                                   notes="", update_time=work_date)
                # 保存属性表数据
                userAttribute.save()
            # 注册成功
            rsp_dict["result"] = "success"
            rsp_dict["errorMsg"] = "注册成功,请登录."
            # 成功返回json数据格式
            return JsonResponse(rsp_dict)
        except Exception as e:
            rsp_dict["errorMsg"] = "注册用户失败."
            # 错误返回json数据格式
            return JsonResponse(rsp_dict)
    else:
        # 跳转到注册页面
        return render(request, "study_system/register.html", rsp_dict)

4,编辑页面模板代码:

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>study system</title>
    <link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css">
    <script type="text/javascript" src="/static/study_system/jquery1.3.3/jquery.min.js"></script>
    <style>
        .container {
            max-width: 400px;
            margin: 0 auto;
            padding-top: 100px;
        }
    </style>

    <script type="text/javascript">

        /* 自动载入 */
        $(function () {
            // 清空输入栏
            clean_input();
        });

        // 清空输入栏
        function clean_input() {
            $("#username").val("");
            $("#password").val("");
            $("#email").val("");
            $("#parent_email").val("");
        }

        // 学习模式切换不同角色选择
        function change_study_type() {
            var study_type = $("select[name='study_type']").val();
            {#alert(study_type);#}
            var optionHtml = "";
            if (study_type == '1') {
                optionHtml += "<option value='4'>自导自学</option>";
            } else {
                optionHtml += "<option value='2'>辅导员</option>";
                optionHtml += "<option value='3'>学生</option>";
            }
            {## 清空子元素#}
            $("select[name='role']").empty();
            // 添加到class=中
            $("select[name='role']").append(optionHtml);

            // 角色切换,显示,隐藏关联邮箱输入框
            change_role();
            // 清空输入栏
            clean_input();
        }

        // 角色切换,显示,隐藏关联邮箱输入框
        function change_role() {
            var role = $("select[name='role']").val();
            {#alert(role);#}
            if (role === '3') {
                $('#parent-email-group').show();
            } else {
                $('#parent-email-group').hide();
            }
        }

        //验证,用户名
        function check_username() {
            if ($("#username").val() == "") {
                alert("用户名,不能为空");
                return false;
            }
            return true;
        }

        //验证,密码
        function check_password() {
            if ($("#password").val() == "") {
                alert("密码,不能为空");
                return false;
            }
            return true;
        }

        //验证,邮箱
        function check_email() {
            if ($("#email").val() == "") {
                alert("邮箱,不能为空");
                return false;
            }
            return true;
        }

        //提交表单
        function submitRegister() {
            if (check_username() && check_password() && check_email()) {

                var role = $("#role").val();
                var username = $("#username").val();
                var password = $("#password").val();
                var email = $("#email").val();
                var parent_email = "";
                if (role == "3") {
                    parent_email = $("#parent_email").val();
                }
                //alert("parent_email:" + parent_email);
                // 1,获取csrfmiddlewaretoken的input标签value属性对应的值
                {#var token = $('[name="csrfmiddlewaretoken"]').val();#}
                // 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值
                var csrf_token = '{{ csrf_token }}';

                $.post("/study_system/register/",
                    {
                        'role': role,
                        'username': username,
                        'password': password,
                        'email': email,
                        'parent_email': parent_email,
                        // 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
                        'csrfmiddlewaretoken': csrf_token,
                    }, function (data) {
                        if ("success" == data.result) {
                            alert("注册成功");
                            // 注册成功,去登录页面
                            window.location.href = "/study_system/login/";
                        } else {
                            alert("注册失败:" + data.errorMsg);
                        }
                    });
            }
        }

    </script>
</head>
<body>
<div class="container">
    <h2 class="text-center">注册用户</h2>
    <form method="post" action="{% url 'study_system:register' %}">
        {# 在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}
        {% csrf_token %}
        <div class="form-group">
            <label for="study_type">学习模式</label>
            <select class="form-control" id="study_type" name="study_type" onchange="change_study_type()">
                <option value="1" selected="selected">单人模式</option>
                <option value="2">双人模式</option>
            </select>
        </div>
        <div class="form-group">
            <label for="role">角色类型</label>
            <select class="form-control" id="role" name="role" onchange="change_role()">
                {#                <option value="2">辅导员</option>#}
                {#                <option value="3">学生</option>#}
                <option value="4" selected="selected">自导自学</option>
            </select>
        </div>

        <div class="form-group">
            <label for="username">用户名</label>
            <input type="text" class="form-control" id="username" name="username">
        </div>
        <div class="form-group">
            <label for="password">密码</label>
            <input type="password" class="form-control" id="password" name="password">
        </div>
        <div class="form-group">
            <label for="email">邮箱</label>
            <input type="email" class="form-control" id="email" name="email">
        </div>
        <div id="parent-email-group" class="form-group" style="display: none;">
            <label for="parent_email">关联辅导员邮箱</label>
            <input type="email" class="form-control" id="parent_email" name="parent_email">
        </div>
        <div class="form-group">
            <button type="button" onclick="submitRegister()" class="form-control btn-primary">注册账户</button>
        </div>
        <div class="form-group">
            <button type="reset" class="form-control btn-primary" onclick="clearErrorMessage()">重置</button>
        </div>
        <div class="form-group">
            <a href="{% url 'study_system:login' %}" class="form-control btn-link text-right">登录账户</a>
        </div>
    </form>
</div>
</body>
</html>

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

1,双人模式

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

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

1.2,再注册一个学生用户

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

1,单人模式

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

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

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

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

相关文章

华为OD机试 - 组成最大数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等&#xff0c;香港服务器都能够提供高效稳定的服务。对于跨境电商来说&#xff0c;搭建香港服务器可以更好地满足亚洲用户的购物需求&#xff1b;对于金融机构来说&#xff0c;香港服务器…

安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 什么是弧光 电弧是放电过程中发生的一种现象&#xff0c;当两点之间的电压超过其工频绝缘强度极限时就会发生。当适当的条件出现时&#xff0c;一个携带着电流的等离子产生&#xff0c;直到电源侧的保护设备断开才会消失。空气在通常条件…

31 数据分析(中)numpy介绍

文章目录 工具excelTableauPower Queryjupytermatplotlibnumpy安装导入包快速掌握&#xff08;bushi&#xff09;array和list的相互转化 np的range多维数组的属性array的改变形状array升降维度array内元素的类型数和array的运算array之间的加减法认识轴切片条件与逻辑修改值app…

大规模语言模型高效调参--混合高效微调系列(MAM Adapter,UniPELT)

近年来提出了多种参数高效的迁移学习方法&#xff0c; 这些方法仅微调少量(额外) 参数即可获得强大的性能。虽 然有效&#xff0c; 但人们对为什么有效的关键要素以及各种高效微调方法之间的联系知之甚少。 Adapter 、Prefix Tuning、 LoRA (在结构上和公式上)看起来都不太一样…

SpringCloud小项目——订单积分商城 使用Nacos、Open Feign、Gateway、Sentinel技术栈

目录 引出小项目要求创建极简数据库表订单表&#xff0c;订单明细表商品表积分表 相关微服务积分微服务产品微服务订单微服务调用积分和订单微服务 网关微服务登陆认证通过网关实现对外提供接口API走网关功能 sentinel相关使用Sentinel限流&#xff0c;流量整形Sentinel降级服务…

SparseBEV:High-Performance Sparse 3D Object Detection from Multi-Camera Videos

参考代码&#xff1a;SparseBEV 动机与主要贡献&#xff1a; BEV感知可以按照是否显式构建BEV特征进行划分&#xff0c;显式构建BEV特征的方法需要额外计算量用于特征构建&#xff0c;而类似query方案的方法则不需要这样做。比较两种类型的方法&#xff0c;前者需要更多计算资…

微服务 BFF 架构设计

在现代软件开发中&#xff0c;由于程序、团队、数据规模太大&#xff0c;需要把企业的业务能力进行复用&#xff0c;将领域服务剥离&#xff0c;提供通用能力&#xff0c;避免重复建设和代码&#xff1b;另外服务功能的弹性能力不一样&#xff0c;比如定时任务、数据同步明确的…

mysql面试题39:什么是触发器?触发器的使用场景有哪些?MySQL中都有哪些触发器?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是触发器?触发器的使用场景有哪些? 触发器(Trigger)是数据库中一种特殊类型的存储过程,它在特定的数据库事件(例如插入、更新、删除操作…

软考高级架构师下篇-18大数据架构理论设计与实践

目录 1. 引言2. 传统数据处理系统的问题1.传统数据库的数据过载问题2.大数据的特点3.大数据利用过程4.大数据处理系统架构分析3.典型的大数据架构1. Lambda架构2.Kappa架构3. Lambda架构与Kappa架构的对比4.大数据架构的实践1.大规模视频网络2.广告平台3.公司智能决策大数据系统…

Redis-集群

Redis-集群 主从复制和哨兵只能在主节点进行写数据&#xff0c;从节点读取数据&#xff0c;因此本质上&#xff0c;是进行了读写的分离&#xff0c;每个节点都保存了所有的数据&#xff0c;并不能实现一个很好的分布式效果。 1.哈希求余算法 假设有N台主机&#xff0c;对每台…

对比纯软开与嵌入式硬件开发谁更好呢?

对比纯软开与嵌入式硬件开发谁更好呢&#xff1f; 你的纠结和犹豫是理解的&#xff0c;职业选择确实是一个重要的决策。我明白你在嵌入式和软件开发之间犹豫不决的原因。让我给你提供一些建议&#xff0c;帮助你做出更明智的决定。最近很多小伙伴找我&#xff0c;说想要一些嵌入…

日期时间参数,格式配置(SpringBoot)

介绍 在SpringBoot项目中&#xff0c;接口中的日期和时间类型的参数&#xff0c;配置格式。 日期格式 接口中常用的日期时间格式有两种&#xff1a; 字符串&#xff08;比如&#xff1a;yyyy-MM-dd HH:mm:ss&#xff09;时间戳&#xff08;比如&#xff1a;1696839876955&a…

【云计算网络安全】僵尸网络详解:工作原理、控制和保护方法

文章目录 一、什么是僵尸网络&#xff1f;二、僵尸网络因为什么原因而诞生&#xff1f;三、僵尸网络主要用途四、僵尸网络如何工作&#xff1f;五、如何控制僵尸网络&#xff1f;5.1 客户端/服务器僵尸网络模型5.1.1 星形网络拓扑5.1.2 多服务器网络拓扑5.1.3 分层网络拓扑 5.2…

Maven依赖解决

记一次Maven依赖冲突解决 以zookeeper为例 一、问题描述 当下载zookeeper的2.2.6.RELEASE时&#xff0c;报错 Could not find artifact org.springframework.cloud:spring-cloud-starter-zookeeper-discovery:pom:2.2.6.RELEASE in central (https://repo.maven.apache.org/ma…

3D包容盒子

原理简述 包围体&#xff08;包容盒&#xff09;是一个简单的几何空间&#xff0c;里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤&#xff08;即当包围体碰撞&#xff0c;才进行精确碰撞检测和处理&#xff09;。包…

Flutter中的StreamBuilder和FutureBuilder有什么区别

流行的跨平台框架 Flutter 为开发人员提供了两个强大的小部件来处理异步操作&#xff1a;StreamBuilder 和 FutureBuilder。尽管它们有相似之处&#xff0c;但了解它们的不同之处&#xff0c;以便为您的特定用例选择合适的一个是至关重要的。在这篇博文中&#xff0c;我们将深入…

matlab相机标定实验

实验原理 1. 相机标定坐标系 相机的参数对目标的识别、定位精度有很大的影响&#xff0c;相机标定就是为了求出相机的内外参数。标定中有3个不同层次的坐标系&#xff1a;世界坐标系、相机坐标系和图像坐标系&#xff08;图像物理坐标系和图像像素坐标系&#xff09;。世界坐…

HTML-注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head> <body><from action"#" method"get"><table border"1" align&q…

智能井盖传感器:提升城市安全与便利的利器

在智能化城市建设的浪潮中&#xff0c;WITBEE万宾智能井盖传感器&#xff0c;正以其卓越的性能和创新的科技&#xff0c;吸引着越来越多的关注。本文小编将为大家详细介绍这款产品的独特优势和广阔应用前景。 在我们生活的城市中&#xff0c;井盖可能是一个最不起眼的存在。然而…