智慧校園比賽系統(tǒng)-Python+Django
?作者主頁:
?簡介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、CSDN博客專家? Java項(xiàng)目、簡歷模板、學(xué)習(xí)資料、面試題庫、技術(shù)互助
文末獲取源碼
項(xiàng)目編號:BS-Python-002
1.項(xiàng)目說明
項(xiàng)目名稱:智慧答題系統(tǒng)
項(xiàng)目版本:V 1.0
版本變化:無
完成日期:2022年1月20日
2.? 系統(tǒng)環(huán)境
Windows或Linux發(fā)行版(Ubuntu16.04 / CentOS等)
MySQL 5.5以上版本
Python3.5以上版本
Redis任意新版本即可
Django版本2.1
本項(xiàng)目基于Python+Django技術(shù)開發(fā)實(shí)現(xiàn),開發(fā)工具IDEA,數(shù)據(jù)庫MYSQL5.7
主要實(shí)現(xiàn)題庫設(shè)置,比賽生成,在線答題,自動排名,自動組卷,自動改卷等相關(guān)功能。
下面展示一下系統(tǒng)的相關(guān)功能:

用戶注冊

登陸

快速出題

配置比賽

上傳題庫

參與比賽

開始作題


自動閱卷排名

修改個(gè)人密碼

查看所有比賽

以上是智慧校園比賽系統(tǒng)的主要內(nèi)容
系統(tǒng)部分核心代碼:
# -*- coding: utf-8 -*-from django.contrib.auth.models import Userfrom django.conf import settingsfrom django.db import transactionfrom django.views.decorators.csrf import csrf_exemptfrom account.models import Profilefrom business.models import BusinessAccountInfofrom utils.response import json_responsefrom utils.errors import BizError, UserErrordef check_biz(request):
? ?email = request.GET.get('email', '') ?# 獲取郵箱
? ?try: ?# 檢查數(shù)據(jù)庫中是否由該郵箱注冊過的數(shù)據(jù)
? ? ? ?biz = BusinessAccountInfo.objects.get(email=email) ? ?except BusinessAccountInfo.DoesNotExist:
? ? ? ?biz = None
? ?return json_response(200, 'OK', { ?# 返回是否已經(jīng)被注冊過和是否已經(jīng)有此用戶
? ? ? ?'userexists': User.objects.filter(email=email).exists(), ? ? ? ?'bizaccountexists': bool(biz)
? ?})def registry_biz(request):
? ?email = request.POST.get('email', '') ?# 獲取填寫的郵箱
? ?name = request.POST.get('name', '') ?# 獲取填寫的機(jī)構(gòu)名
? ?username = request.POST.get('username', '') ?# 獲取填寫的機(jī)構(gòu)聯(lián)系人
? ?phone = request.POST.get('phone', '') ?# 獲取填寫的手機(jī)號
? ?ctype = request.POST.get('type', BusinessAccountInfo.INTERNET) ?# 獲取機(jī)構(gòu)類型
? ?flag = int(request.POST.get('flag', 2)) ?# 獲取一個(gè)標(biāo)記位,代表用戶是創(chuàng)建新用戶還是使用綁定老用戶的方式
? ?uname = email.split('@')[0] ?# 和之前的注冊邏輯沒什么區(qū)別,創(chuàng)建一個(gè)賬戶名
? ?if not User.objects.filter(username__exact=name).exists():
? ? ? ?final_name = username ? ?elif not User.objects.filter(username__exact=uname).exists():
? ? ? ?final_name = uname ? ?else:
? ? ? ?final_name = email ? ?if flag == 2: ?# 如果標(biāo)記位是2,那么將為他創(chuàng)建新用戶
? ? ? ?user = User.objects.create_user(
? ? ? ? ? ?username=final_name,
? ? ? ? ? ?email=email,
? ? ? ? ? ?password=settings.INIT_PASSWORD,
? ? ? ? ? ?is_active=False,
? ? ? ? ? ?is_staff=False
? ? ? ?) ? ?if flag == 1: ?# 如果標(biāo)記位是1,那么為他綁定老用戶
? ? ? ?try:
? ? ? ? ? ?user = User.objects.get(email=email) ? ? ? ?except User.DoesNotExist: ? ? ? ? ? ?return json_response(*UserError.UserNotFound)
? ?pvalues = { ? ? ? ?'phone': phone, ? ? ? ?'name': final_name, ? ? ? ?'user_src': Profile.COMPANY_USER,
? ?}
? ?profile, _ = Profile.objects.select_for_update().get_or_create(email=email) ?# 獲取或創(chuàng)建用戶信息
? ?for k, v in pvalues.items(): ? ? ? ?setattr(profile, k, v)
? ?profile.save()
? ?bizvalues = { ? ? ? ?'company_name': name, ? ? ? ?'company_username': username, ? ? ? ?'company_phone': phone, ? ? ? ?'company_type': ctype,
? ?}
? ?biz, _ = BusinessAccountInfo.objects.select_for_update().get_or_create( ?# 獲取或創(chuàng)建機(jī)構(gòu)賬戶信息
? ? ? ?email=email,
? ? ? ?defaults=bizvalues
? ?) ? ?return json_response(200, 'OK', { ?# 響應(yīng)JSON格式數(shù)據(jù),這個(gè)標(biāo)記位在發(fā)送驗(yàn)證郵件的時(shí)候還有用
? ? ? ?'name': final_name, ? ? ? ?'email': email, ? ? ? ?'flag': flag
? ?})
# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import modelsfrom django.utils.translation import ugettext_lazy as _from shortuuidfield import ShortUUIDFieldfrom utils.basemodels import CreateUpdateMixinclass BusinessAccountInfo(CreateUpdateMixin): ? ?""" 出題帳戶類 """
? ?INTERNET = 0
? ?FINANCE = 1
? ?ENERGY = 2
? ?INFRASTRUCTURE = 3
? ?TRANSPORTATION = 4
? ?COMMUNICATION = 5
? ?TYPE_CHOICES = (
? ? ? ?(INTERNET, '互聯(lián)網(wǎng)'),
? ? ? ?(FINANCE, '金融'),
? ? ? ?(ENERGY, '能源'),
? ? ? ?(INFRASTRUCTURE, '基礎(chǔ)建設(shè)'),
? ? ? ?(TRANSPORTATION, '交通'),
? ? ? ?(COMMUNICATION, '通信')
? ?)
? ?account_id = ShortUUIDField(_(u'出題賬戶id'), max_length=32, help_text=u'出題賬戶唯一標(biāo)識', db_index=True) ? ?# 帳戶信息
? ?email = models.CharField(_(u'郵箱'), max_length=40, blank=True, null=True, help_text=u'郵箱', db_index=True, unique=True) ? ?# 公司信息
? ?company_name = models.CharField(_(u'公司名稱'), max_length=60, blank=True, null=True, help_text=u'公司名稱')
? ?company_type = models.IntegerField(_(u'公司類型'), choices=TYPE_CHOICES, default=INTERNET, help_text=u'公司類型')
? ?company_description = models.TextField(_(u'公司描述'), blank=True, null=True, help_text=u'公司描述')
? ?company_username = models.CharField(_(u'聯(lián)系人'), max_length=32, blank=True, null=True, help_text=u'公司聯(lián)系人')
? ?company_phone = models.CharField(_(u'聯(lián)系電話'), max_length=16, blank=True, null=True, help_text=u'公司聯(lián)系電話', db_index=True)
? ?company_location = models.TextField(_(u'公司位置'), blank=True, null=True, help_text=u'公司聯(lián)系地址') ? ?class Meta:
? ? ? ?verbose_name = _(u'出題賬戶')
? ? ? ?verbose_name_plural = _(u'出題賬戶') ? ?def __unicode__(self): ? ? ? ?return str(self.pk)
? ?def data(self): ? ? ? ?return { ? ? ? ? ? ?'email': self.email, ? ? ? ? ? ?'company_name': self.company_name, ? ? ? ? ? ?'company_type': self.company_type, ? ? ? ? ? ?'company_location': self.company_location, ? ? ? ? ? ?'company_username': self.company_username, ? ? ? ? ? ?'company_phone': self.company_phone,
? ? ? ?}class BusinessAppInfo(CreateUpdateMixin): ? ?""" 應(yīng)用信息類 """
? ?account_id = models.CharField(_(u'出題賬戶id'), max_length=32, help_text=u'出題賬戶唯一標(biāo)識', db_index=True) ? ?# APP 配置信息
? ?app_id = ShortUUIDField(_(u'應(yīng)用id'), max_length=32, help_text=u'應(yīng)用唯一標(biāo)識', db_index=True)
? ?app_name = models.CharField(_(u'應(yīng)用名'), max_length=40, blank=True, null=True, help_text=u'應(yīng)用名')
? ?app_description = models.TextField(_(u'應(yīng)用描述'), blank=True, null=True, help_text=u'應(yīng)用描述') ? ?class Meta:
? ? ? ?verbose_name = _(u'應(yīng)用信息')
? ? ? ?verbose_name_plural = _(u'應(yīng)用信息') ? ?def __unicode__(self): ? ? ? ?return str(self.pk)
? ?def data(self): ? ? ? ?return { ? ? ? ? ? ?'app_id': self.app_id, ? ? ? ? ? ?'app_name': self.app_name, ? ? ? ? ? ?'account_id': self.account_id,
? ? ? ?}class AppConfigInfo(CreateUpdateMixin): ? ?""" 應(yīng)用配置信息類 """
? ?app_id = models.CharField(_(u'應(yīng)用id'), max_length=32, help_text=u'應(yīng)用唯一標(biāo)識', db_index=True)
? ?app_name = models.CharField(_(u'應(yīng)用名'), max_length=40, blank=True, null=True, help_text=u'應(yīng)用名') ? ?# 文案配置
? ?rule_text = models.TextField(_(u'比賽規(guī)則'), max_length=255, blank=True, null=True, help_text=u'比賽規(guī)則') ? ?# 顯示信息
? ?is_show_userinfo = models.BooleanField(_(u'展示用戶表單'), default=False, help_text=u'是否展示用戶信息表單')
? ?userinfo_fields = models.CharField(_(u'用戶表單字段'), max_length=128, blank=True, null=True, help_text=u'需要用戶填寫的字段#隔開')
? ?userinfo_field_names = models.CharField(_('用戶表單label'), max_length=128, blank=True, null=True, help_text=u'用戶需要填寫的表單字段label名稱')
? ?option_fields = models.CharField(_(u'下拉框字段'), max_length=128, blank=True, null=True, help_text=u'下拉框字段選項(xiàng)配置,#號隔開,每個(gè)字段由:h和,號組成。 如 option1:吃飯,喝水,睡覺#option2:上班,學(xué)習(xí),看電影') ? ?class Meta:
? ? ? ?verbose_name = _(u'應(yīng)用配置信息')
? ? ? ?verbose_name_plural = _(u'應(yīng)用配置信息') ? ?def __unicode__(self): ? ? ? ?return str(self.pk) ? ?# 頁面配置數(shù)據(jù)
? ?def show_info(self): ? ? ? ?return { ? ? ? ? ? ?'is_show_userinfo': self.is_show_userinfo, ? ? ? ? ? ?'userinfo_fields': self.userinfo_fields, ? ? ? ? ? ?'userinfo_field_names': self.userinfo_field_names, ? ? ? ? ? ?'option_fields': self.option_fields,
? ? ? ?}
? ?def text_info(self): ? ? ? ?return { ? ? ? ? ? ?'rule_text': self.rule_text,
? ? ? ?}
? ?def data(self): ? ? ? ?return { ? ? ? ? ? ?'show_info': self.show_info, ? ? ? ? ? ?'text_info': self.text_info, ? ? ? ? ? ?'app_id': self.app_id, ? ? ? ? ? ?'app_name': self.app_name
? ? ? ?}class UserInfoImage(CreateUpdateMixin): ? ?"""
? ?用戶表單圖片配置類
? ?"""
? ?uii_name = models.CharField(_(u'配置名稱'), max_length=32, blank=True, null=True, help_text=u'信息圖片配置名稱') ? ?# 用戶信息
? ?name = models.CharField(_(u'姓名'), max_length=60, blank=True, null=True, help_text=u'姓名')
? ?sex = models.CharField(_(u'性別'), max_length=60, blank=True, null=True, help_text=u'性別')
? ?age = models.CharField(_(u'年齡'), max_length=60, blank=True, null=True, help_text=u'年齡')
? ?phone = models.CharField(_(u'手機(jī)號'), max_length=60, blank=True, null=True, help_text=u'電話')
? ?wxid = models.CharField(_(u'微信號'), max_length=60, blank=True, null=True, help_text=u'微信號')
? ?email = models.CharField(_(u'郵箱'), max_length=60, blank=True, null=True, help_text=u'郵箱')
? ?pid = models.CharField(_(u'身份證號'), max_length=60, blank=True, null=True, help_text=u'身份證號')
? ?graduated_from = models.CharField(_(u'畢業(yè)院校'), max_length=60, blank=True, null=True, help_text=u'畢業(yè)院校')
? ?address = models.CharField(_(u'地址'), max_length=60, blank=True, null=True, help_text=u'聯(lián)系地址')
? ?resume = models.CharField(_(u'簡歷'), max_length=60, blank=True, null=True, help_text=u'簡歷') ? ?class Meta:
? ? ? ?verbose_name = _(u'用戶信息圖片配置')
? ? ? ?verbose_name_plural = _(u'用戶信息圖片配置') ? ?def __unicode__(self): ? ? ? ?return str(self.pk)
? ?def data(self): ? ? ? ?return { ? ? ? ? ? ?'name': self.name, ? ? ? ? ? ?'sex': self.sex, ? ? ? ? ? ?'age': self.age, ? ? ? ? ? ?'phone': self.phone, ? ? ? ? ? ?'wxid': self.wxid, ? ? ? ? ? ?'email': self.email, ? ? ? ? ? ?'pid': self.pid, ? ? ? ? ? ?'graduated_from': self.graduated_from, ? ? ? ? ? ?'address': self.address,
? ? ? ?}class UserInfoRegex(CreateUpdateMixin): ? ?"""
? ?用戶正則表達(dá)式配置類
? ?"""
? ?field_name = models.CharField(_(u'字段名'), max_length=16, blank=True, null=True, help_text=u'字段名')
? ?regex = models.CharField(_(u'正則表達(dá)式值'), max_length=40, blank=True, null=True, help_text=u'正則表達(dá)式')
? ?description = models.CharField(_(u'description'), max_length=40, blank=True, help_text=u'錯(cuò)誤描述') ? ?class Meta:
? ? ? ?verbose_name = _(u'用戶信息字段正則表達(dá)式')
? ? ? ?verbose_name_plural = _(u'用戶信息字段正則表達(dá)式') ? ?def __unicode__(self): ? ? ? ?return self.field_name
? ?def data(self): ? ? ? ?return { ? ? ? ? ? ?'field_name': self.field_name, ? ? ? ? ? ?'regex': self.regex, ? ? ? ? ? ?'description': self.description,
? ? ? ?}
# -*- coding: utf-8 -*-from django.contrib import adminfrom competition.models import (BankInfo, ChoiceInfo, CompetitionKindInfo,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CompetitionQAInfo, FillInBlankInfo)class CompetitionKindInfoAdmin(admin.ModelAdmin): ? ?"""
? ?比賽信息后臺
? ?"""
? ?list_display = ('kind_id', 'account_id', 'app_id', 'bank_id', 'kind_name', 'total_score', 'question_num', 'total_partin_num', 'status', 'created_at', 'updated_at')
? ?list_filter = ('account_id', 'status')
? ?search_fields = ('kind_name', 'kind_id', 'app_id', 'account_id',)
? ?readonly_fields = ('kind_id', 'total_partin_num',) ? ?def save_model(self, request, obj, form, change):
? ? ? ?obj.save() ? ?def delete_model(self, request, obj):
? ? ? ?obj.delete() ? ?def get_readonly_fields(self, request, obj=None): ? ? ? ?return self.readonly_fieldsclass BankInfoAdmin(admin.ModelAdmin): ? ?"""
? ?題庫后臺配置
? ?"""
? ?list_display = ('bank_id', 'bank_type', 'kind_num', 'choice_num', 'fillinblank_num', 'partin_num')
? ?list_filter = ('bank_type', 'bank_id',)
? ?search_fields = ('bank_id',)
? ?readonly_fields = ('bank_id', 'choice_num', 'fillinblank_num', 'kind_num', 'partin_num') ? ?def save_model(self, request, obj, form, change):
? ? ? ?obj.choice_num = ChoiceInfo.objects.filter(bank_id=obj.bank_id).count()
? ? ? ?obj.fillinblank_num = FillInBlankInfo.objects.filter(bank_id=obj.bank_id).count()
? ? ? ?obj.save()class ChoiceInfoAdmin(admin.ModelAdmin): ? ?"""
? ?選擇題配置后臺
? ?"""
? ?list_display = ('bank_id', 'question', 'answer', 'item1', 'item2', 'item3', 'item4', 'source', 'status', 'created_at', 'updated_at')
? ?list_filter = ('bank_id', 'status')
? ?search_fields = ('bank_id', 'question', 'answer', 'item1', 'item2', 'item3', 'item4') ? ?def save_model(self, request, obj, form, change):
? ? ? ?obj.save() ? ?def delete_model(self, request, obj):
? ? ? ?obj.delete()class FillInBlankInfoAdmin(admin.ModelAdmin): ? ?"""
? ?填空題配置后臺
? ?"""
? ?list_display = ('bank_id', 'question', 'answer', 'source', 'status', 'created_at', 'updated_at')
? ?list_filter = ('bank_id', 'status')
? ?search_fields = ('bank_id', 'question', 'answer')class CompetitionQAInfoAdmin(admin.ModelAdmin): ? ?"""
? ?答題記錄信息后臺
? ?"""
? ?list_display = ('kind_id', 'status', 'uid', 'qa_id', 'score', 'created_at', 'updated_at')
? ?list_filter = ('kind_id', 'uid', 'qa_id', 'started', 'finished', 'status')
? ?search_fields = ('uid', 'kind_id', )
? ?readonly_fields = ('qa_id',)
admin.site.register(CompetitionKindInfo, CompetitionKindInfoAdmin)
admin.site.register(CompetitionQAInfo, CompetitionQAInfoAdmin)
admin.site.register(ChoiceInfo, ChoiceInfoAdmin)
admin.site.register(FillInBlankInfo, FillInBlankInfoAdmin)
admin.site.register(BankInfo, BankInfoAdmin)