射击比赛报名与成绩管理系统设计

详细项目见githubicon-default.png?t=O83Ahttps://github.com/raccoonlms/django1

项目概述

本项目旨在开发一个射击比赛报名与成绩管理系统,该系统支持角色管理,包括管理员和普通用户。管理员可以管理比赛项目、参赛者信息和成绩,而普通用户可以查看比赛信息并进行报名。系统采用Django框架进行开发,以提供稳定和高效的后端服务。

系统功能

用户角色管理

  • 管理员:拥有系统的最高权限,可以添加、删除和查询比赛项目,管理参赛者信息,录入和修改成绩。
  • 普通用户:可以查看比赛信息,进行报名,查看自己的参赛信息和成绩。

用户登录

  • 系统提供用户登录功能,支持用户名和密码验证,以及验证码机制防止自动化攻击。
  • # 用户登录
    def login(request):
        if request.method == 'POST':
            form = LoginForm(request.POST)
            
            if form.is_valid():
                # 获取表单提交的数据
                user_id = form.cleaned_data['user_id']
                password = form.cleaned_data['password']
                captcha = form.cleaned_data['captcha']  # 获取用户输入的验证码
    
                if captcha != request.session.get('randomcode', ''):
                    return render(request, 'login.html', {'form': form, 'error': '验证码错误'})
                
                # 首先检查是否为管理员账户
                if user_id == 'admin' and password == 'admin':
                    return redirect('admin_dashboard')
                
                # 检查是否为普通用户
                try:
                    user = User.objects.get(user_id=user_id, password=password)
                    # 用户验证成功,登录后重定向到用户仪表板
                    request.session['user_id'] = user.user_id
                    request.session['password'] = user.password
                    return redirect('user_dashboard')
                except User.DoesNotExist:
                    # 如果用户不存在,则显示错误信息
                    return render(request, 'login.html', {'form': form, 'error': '用户名或密码错误'})
        else:
            form = LoginForm()
        
        # 渲染登录页面
        return render(request, 'login.html', {'form': form})
    
    #验证码随机字符
    def getRandomChar():
        num=str(randint(0,9))
        lower=chr(randint(97,122))
        upper=chr(randint(65,90))
        char=choice([num,lower,upper])
        return char
  • 0e1f1fc524284061b0a4e2fd313bb3fa.pngc8301112e7c44a3e9e1798769df347cf.png

比赛项目管理

  • 管理员可以添加新的比赛项目,包括项目编号、名称、开始时间和结束时间。
  • 管理员可以删除或查询特定的比赛项目。
    # 查询比赛项目
    def query_competition(request):
        # 获取查询条件,如果为空则不进行过滤
        event_id = request.GET.get('event_id', '')
        event_name = request.GET.get('event_name', '')
    
        # 默认查询所有数据
        events = Event.objects.all()
    
        # 如果有查询条件,过滤数据
        if event_id:
            events = events.filter(event_id=event_id)
        if event_name:
            events = events.filter(event_name__icontains=event_name)
    
        # 设置分页
        paginator = Paginator(events, 10)  # 每页显示 10 条记录
        page_number = request.GET.get('page')  # 获取当前页码
        page_obj = paginator.get_page(page_number)  # 获取当前页的分页对象
    
        # 传递分页对象和其他数据到模板
        return render(request, 'add_competition.html', {
            'page_obj': page_obj,
            'event_id': event_id,
            'event_name': event_name
        })
    
    # 增加比赛项目
    def add_competition(request):
        if request.method == "POST":
            form = EventForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('query_competition')  # 增加成功后跳转到查询页面
            else:
                return render(request, 'add_competition.html', {'form': form, 'error': "请确保输入项有效且唯一"})
        else:
            form = EventForm()
        
        # 直接查询所有比赛项目
        events = Event.objects.all()
        paginator = Paginator(events, 10)  # 每页显示 10 条记录
        page_number = request.GET.get('page')  # 获取当前页码
        page_obj = paginator.get_page(page_number)  # 获取当前页的分页对象
    
        return render(request, 'add_competition.html', {'form': form, 'events': page_obj})
    
    # 删除比赛项目
    def delete_competition(request):
        if request.method == "POST":
            event_id = request.POST.get('event_id')
            event_name = request.POST.get('event_name')
    
            # 根据项目编号或描述删除项目
            if event_id:
                Event.objects.filter(event_id=event_id).delete()
            elif event_name:
                Event.objects.filter(event_name=event_name).delete()
    
            return redirect('query_competition')  # 删除后跳转到查询页面
    7995c232b662429ea344b54724d6f6d9.png

参赛者管理

  • 用户可以查看所有比赛项目并选择报名。
  • 管理员可以查看所有参赛者信息,并进行管理。02abf4ab9c2942c182a9b845831ef877.png

成绩管理

  • 管理员可以录入和修改参赛者的成绩,包括预赛成绩、决赛成绩和排名。

系统架构

前端

  • 使用HTML、CSS进行页面布局和样式设计。
  • 利用Django模板系统动态渲染页面内容。
  • <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Login</title>
        {% load static %}
        <style>
            /* 基础样式重置 */
            body, html {
                background-image: url("{% static 'images/1.gif' %}");
                background-size: cover;  /* 保证背景图覆盖整个页面 */
                background-position: center;  /* 让背景图居中显示 */
                background-repeat: no-repeat;  /* 防止背景图重复 */
                margin: 0;
                height: 100vh; 
            }
    
            /* 添加Logo定位样式 */
            .logo {
                position: absolute;
                top: 20px;
                left: 20px;
                width: 400px; /* 你可以根据需要调整logo大小 */
            }
    
            .container {
                width: 100%;
                max-width: 400px;
                margin: 50px auto;
                padding: 20px;
                background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);
                box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
                border-radius: 8px;
            }
    
            /* 表单标题样式 */
            h2 {
                text-align: center;
                margin-bottom: 20px;
                color: #333;
            }
    
            /* 表单字段样式 */
            .form-group {
                margin-bottom: 15px;
            }
    
            .form-group label {
                display: block;
                margin-bottom: 5px;
                font-weight: bold;
            }
    
            .form-group input {
                width: 100%;
                padding: 8px;
                box-sizing: border-box;
                border: 1px solid #ccc;
                border-radius: 4px;
            }
    
            /* 提交按钮样式 */
            .submit-btn {
                width: 100%;
                padding: 10px;
                background-image: linear-gradient(120deg, #f6d365 0%, #fda085 100%);
                color: #fff;
                border: none;
                border-radius: 4px;
                cursor: pointer;
                font-size: 16px;
            }
    
            .submit-btn:hover {
                background-color: #45a049;
            }
    
            /* 错误消息样式 */
            .error-msg {
                color: red;
                text-align: center;
                margin-top: 10px;
            }
    
        </style>
    </head>
    <body>
        <!-- 添加logo  -->
        <img src="{% static 'images/logo.png' %}" alt="Logo" class="logo">
       
        <div class="container">
            <h2>欢迎使用比赛成绩管理系统</h2>
            <h2>用户登录</h2>
            <!-- ... 其他代码 ... -->
            <form method="post">
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        {{ field.label_tag }}<br>
                        {{ field }}<br>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <img src="{% url 'getpng' %}" alt="验证码" onclick="this.src='{% url 'getpng' %}?' + Math.random();"> 
                    <a><font size=2>点击图片刷新</font></a><br>
                </div>
                <button type="submit" class="submit-btn">登录</button>
                <a href="{% url 'register' %}" class="register-btn">注册</a>
            </form>
            {% if error %}
                <p class="error-msg">{{ error }}</p>
            {% endif %}
        </div>
    </body>
    </html>
    

后端

  • Django框架:提供ORM系统、URL路由、视图处理等功能。
  • 模型(Models):定义了用户(User)、比赛项目(Event)、参赛者信息(Contestant)和成绩(Score)等数据模型。
  • 表单(Forms):用于数据验证和用户输入。
  • 视图(Views):处理业务逻辑,响应用户请求。
  • URL配置(Urls):定义路由,将URL路径映射到相应的视图函数。

数据库

  • 使用Django自带的数据库系统,通过ORM进行数据操作。

系统流程

用户登录流程

  1. 用户输入用户名、密码和验证码。
  2. 系统验证用户名和密码,同时检查验证码是否正确。
  3. 如果验证通过,根据用户角色重定向到相应的仪表板。

比赛项目管理流程

  1. 管理员填写比赛项目的相关信息。
  2. 系统将信息保存到数据库。
  3. 管理员可以查询或删除已有的比赛项目。

参赛者报名流程

  1. 用户查看比赛列表,选择想要参加的比赛。
  2. 用户填写报名信息并提交。
  3. 系统保存报名信息到数据库。

成绩录入流程

  1. 管理员填写参赛者的成绩信息。
  2. 系统将成绩信息保存到数据库。
  3. 管理员可以查询或修改已有的成绩信息。

安全性和维护

安全性

  • 系统采用用户角色管理,确保数据的安全性。
  • 登录时使用验证码机制防止自动化攻击。
  • 数据库操作通过Django的ORM系统进行,防止SQL注入攻击。

维护

  • 系统采用模块化设计,便于后期维护和升级。
  • 代码遵循Django的开发规范,易于理解和修改。

结论

射击比赛报名与成绩管理系统是一个功能齐全、操作简便、安全可靠的管理系统。它能够有效地帮助管理员管理比赛项目、参赛者信息和成绩,同时为普通用户提供便捷的报名和查询服务。通过本系统,可以大大提高比赛管理的效率和准确性。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值