详细项目见github
https://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
比赛项目管理
- 管理员可以添加新的比赛项目,包括项目编号、名称、开始时间和结束时间。
- 管理员可以删除或查询特定的比赛项目。
# 查询比赛项目 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') # 删除后跳转到查询页面
参赛者管理
- 用户可以查看所有比赛项目并选择报名。
- 管理员可以查看所有参赛者信息,并进行管理。
成绩管理
- 管理员可以录入和修改参赛者的成绩,包括预赛成绩、决赛成绩和排名。
系统架构
前端
- 使用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进行数据操作。
系统流程
用户登录流程
- 用户输入用户名、密码和验证码。
- 系统验证用户名和密码,同时检查验证码是否正确。
- 如果验证通过,根据用户角色重定向到相应的仪表板。
比赛项目管理流程
- 管理员填写比赛项目的相关信息。
- 系统将信息保存到数据库。
- 管理员可以查询或删除已有的比赛项目。
参赛者报名流程
- 用户查看比赛列表,选择想要参加的比赛。
- 用户填写报名信息并提交。
- 系统保存报名信息到数据库。
成绩录入流程
- 管理员填写参赛者的成绩信息。
- 系统将成绩信息保存到数据库。
- 管理员可以查询或修改已有的成绩信息。
安全性和维护
安全性
- 系统采用用户角色管理,确保数据的安全性。
- 登录时使用验证码机制防止自动化攻击。
- 数据库操作通过Django的ORM系统进行,防止SQL注入攻击。
维护
- 系统采用模块化设计,便于后期维护和升级。
- 代码遵循Django的开发规范,易于理解和修改。
结论
射击比赛报名与成绩管理系统是一个功能齐全、操作简便、安全可靠的管理系统。它能够有效地帮助管理员管理比赛项目、参赛者信息和成绩,同时为普通用户提供便捷的报名和查询服务。通过本系统,可以大大提高比赛管理的效率和准确性。