在虚拟环境下输入命令“python manage.py runserver”启动项目,然后,访问“http://127.0.0.1:8000”进入网站首页,如图1所示。
注册用户
鼠标悬浮至顶部导航中的“登录”按钮时,单击“密码”登录,弹出登录框,如图2所示。如果没有账号,需要点击登录框中的“注册”按钮进行注册,如图3所示。
在注册页面中,需要填写真实可用的邮箱,注册成功后,需要进行邮箱验证,如图4所示。单击“发送邮件”按钮,提示发送信息,如图5所示。
查看邮箱,如图6所示。
由于我们在本地测试,不能直接单击邮箱验证链接,可以手动赋值链接,然后在链接地址前添加“http://127.0.0.1:8000”, 即完成的链接地址为:“http://127.0.0.1:8000/auth/email_notify?email=邮箱地址&sign=53ec094a-4acf-11e9-8b5b-b0d59d3cadab”。然后使用浏览器访问该地址即可完成验证并自动登录,如图7所示。
注册完用户后,即可参与答题,如选择热门比赛。点击一个比赛,即可进入该比赛信息页,如图8所示。
单击“开始挑战”按钮开始答题,如图9所示。单击“查看排行榜”按钮,即可查看排行榜。
在答题页面,单击“后退”按钮,返回上一题;单击“前进”按钮,进入下一题;单击“交卷”按钮,显示答题成绩,如图10所示。
注册机构
机构用户可以参与出题,用户需要先注册结构才能成为机构用户。单击顶部导航中的“成为机构”按钮,进入注册机构页面,如图11所示。在该页面中,邮箱填写用户注册网站时邮箱。
注册完成后,单击导航栏顶部的“快速出题”按钮,进入出题页面。如图12所示。
在快速出题页面,需要先来录制题库,然后再配置比赛。单击“开始录制”按钮,如图13所示。创建题库时,需要先下载题库模块,然后根据模板提示,创建自己的Excel题库。然后填写题库名称,选择题库类型,上传Excel文件,最后单击“开始录制”按钮,上传题库。
上传完题库以后,开始配置比赛。在快速出题页面,单击“配置比赛”超链接,进入配置比赛页面。配置比赛时,选择题库,填写配置信息。如果需要答题用户在比赛前填写用户信息,则需要勾选“开启录入信息功能”,然后勾选下面的字段,如图14所示。配置完成后,页面跳转到答题页,单击“开始挑战”按钮,弹出一个填写答题用户信息的表单,该表单中的字段就是在配置信息中设定的内容,如图15所示。
后台管理员
后台管理员可以通过账号密码登录后台,输入网址“http://127.0.0.1:8000/admin/”,输入如下账号密码即可登录。
账号:mr
密码:mrsoft
登录成功后进入后台主页,如图16所示。在后台主页,管理员可以根据对应菜单执行相应的管理工作。
部分源码如下,其余完整详见下载。
# -*- coding: utf-8 -*- from django.contrib import admin from business.models import (AppConfigInfo, BusinessAccountInfo, BusinessAppInfo, UserInfoImage, UserInfoRegex) from utils.redis.rpageconfig import set_pageconfig, set_form_regex, rem_form_regex class BusinessAccountInfoAdmin(admin.ModelAdmin): """ 商家账户后台 """ list_display = ('account_id', 'email', 'company_name', 'company_description', 'company_username', 'company_phone', 'company_location', 'status', 'created_at', 'updated_at') list_filter = ('account_id', 'status') readonly_fields = ('account_id',) class BusinessAppInfoAdmin(admin.ModelAdmin): """ App信息后台 """ list_display = ('account_id', 'app_id', 'app_name', 'app_description', 'status', 'created_at', 'updated_at') list_filter = ('account_id', 'app_id', 'status') readonly_fields = ('app_id',) class AppConfigInfoAdmin(admin.ModelAdmin): """ App具体配置后台 """ list_display = ('app_id', 'app_name', 'status', 'created_at', 'updated_at') search_fields = ('app_id', 'app_name') fieldsets = ( ('None', { 'fields': ('app_id', 'app_name',) }), (u'文案配置', { 'classes': ('collapse',), 'fields': ( 'rule_text', ), }), (u'显示信息相关', { 'classes': ('collapse',), 'fields': ( 'is_show_userinfo', 'userinfo_fields', 'userinfo_field_names', 'option_fields',) }), ) def save_model(self, request, obj, form, change): obj.save() set_pageconfig(obj.data) class UserInfoImageAdmin(admin.ModelAdmin): """ 用户表单图片配置后台 """ list_display = ('uii_name', 'status', 'created_at', 'updated_at') def save_model(self, request, obj, form, change): obj.save() class UserInfoRegexAdmin(admin.ModelAdmin): """ 用户表单正则表达式配置后台 """ list_display = ('field_name', 'regex', 'description', 'status', 'created_at', 'updated_at') list_filter = ('field_name',) def save_model(self, request, obj, form, change): set_form_regex(obj.field_name, obj.data) obj.save() def delete_model(self, request, obj): rem_form_regex(obj.field_name) obj.delete() admin.site.register(BusinessAccountInfo, BusinessAccountInfoAdmin) admin.site.register(BusinessAppInfo, BusinessAppInfoAdmin) admin.site.register(AppConfigInfo, AppConfigInfoAdmin) admin.site.register(UserInfoImage, UserInfoImageAdmin) admin.site.register(UserInfoRegex, UserInfoRegexAdmin)