django 乒乓球赛事管理系统 ---附源码62085
4 乒乓球赛事管理系统详细设计与实现
乒乓球赛事管理系统的详细设计与实现主要是根据前面的乒乓球赛事管理系统的需求分析和乒乓球赛事管理系统的总体设计来设计页面并实现业务逻辑。主要从乒乓球赛事管理系统界面实现、业务逻辑实现这两部分进行介绍。
4.1用户功能模块
4.1.1 前台首页界面
当进入乒乓球赛事管理系统的时候,系统以上中下的布局进行展示,首先映入眼帘的是系统的导航栏,下面是轮播图,再往下是公告信息,其主界面展示如下图4-1所示。
图4-1 前台首页界面图
4.1.2 用户注册界面
乒乓球赛事管理系统的游客可以进行注册登录,当用户右上角“注册”按钮的时候,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号等后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可注册成功。其用用户注册界面展示如下图4-2所示。
图4-2注册界面图
注册关键代码如下:
def Register(self, ctx):
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
if "username" not in body and body["username"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名不能为空",
}
}, ensure_ascii=False))
if "user_group" not in body and body["user_group"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}, ensure_ascii=False))
if "password" not in body and body["password"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "密码不能为空",
}
}, ensure_ascii=False))
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名已存在",
}
}, ensure_ascii=False))
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
4.1.3 用户登录界面
乒乓球赛事管理系统中的前台上注册后的用户是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到乒乓球赛事管理系统的首页中;否则将会提示相应错误信息,用户登录界面如下图4-3所示。
图4-3用户登录界面图
登录关键代码如下:
def Login(self, ctx):
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']}, {"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
if obj["state"] == 1:
if obj["password"] == password:
timeout = timezone.now()
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
ctx.request.session[token] = obj["user_id"]
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
4.1.4体育资讯界面
用户点击“体育资讯”菜单显示所有的体育资讯信息,可以按照条件进行体育资讯的筛选或者输入关键词进行局部搜索,点击可以进入体育资讯详细展示界面,在此界面用户可以收藏、点赞和评论。界面如图4-4所示。
图4-4体育资讯界面图
4.1.5赛事信息详情界面
当访客点击“赛事信息”后就可以看到所有的赛事信息,可以输入赛事名称或者比赛时间进行搜索查询,选择你想要了解的赛事后将会进入该款赛事的详情界面,可以了解到该赛事的赛事名称、比赛时间、入场费用、比赛地点等,同时可以对点击下方的“报名”、“点赞”、“收藏”进行相关操作,赛事详情展示界面如图4-5所示。
图4-5赛事详情界面图
4.1.6 报名界面
当用户在赛事信息详情界面想要进行报名,点击下方的“报名”按钮,就会跳转到报名信息填写界面,根据界面提示输入报名信息,点击“提交”按钮,报名就完成了,报名界面如下图4-6所示。
图4-6 报名界面图
4.1.7选手展示详情界面
用户可以查看选手展示信息,在查询到自己想要了解的选手展示的时候,可以进入查看详细的介绍。选手展示详情界面如下图4-7所示。
图4-7选手展示详情界面图
4.2管理员功能模块
4.2.1系统用户管理界面
乒乓球赛事管理系统中的管理人员在“系统用户”这一菜单是中可以对注册的游客用户以及管理员进行管控。界面如下图4-8所示。
图4-8系统用户管理界面图
用户管理关键代码如下:
def Add(self, ctx):
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
result = self.service.Add(body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
4.2.2赛事信息管理界面
管理员点击“赛事信息”会显示出所有的赛事信息,支持输入比赛名称对赛事信息进行查询,如果想要添加新的赛事信息,点击“添加”按钮,输入比赛名称、比赛图片、比赛时间、比赛地点、入场费用、比赛规则等信息,点击“提交”按钮就可以添加了,同时可以选择某一条赛事信息,点击“删除”进行删除。界面如下图4-9所示。
图4-9赛事信息管理界面图
赛事信息管理关键代码如下:
def Del(self, ctx):
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
4.2.3比赛结果管理界面
管理员点击“比赛结果”会显示出所有的比赛结果信息,支持通过参赛选手或者比赛名称对比赛结果信息进行查询,如果想要添加新的比赛结果信息,点击“添加”按钮,输入相关信息,点击“提交”按钮就可以添加了,同时可以选择某一条比赛结果信息,点击“删除”进行删除。界面如下图4-10所示。
图4-10比赛结果管理界面图
比赛结果管理关键代码如下:
def Get_list(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
if "page" in query:
config_plus["page"] = query.pop("page")
if "size" in query:
config_plus["size"] = query.pop("size")
if "orderby" in query:
config_plus["orderby"] = query.pop("orderby")
if "like" in query:
config_plus["like"] = query.pop("like")
if "groupby" in query:
config_plus["groupby"] = query.pop("groupby")
count = self.service.Count(query)
lst = []
if self.service.error:
return {"error": self.service.error}
elif count:
lst = self.service.Get_list(query,
obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
self.interact_list(ctx, lst)
return {"result": {"list": lst, "count": count}}
4.2.4历史比赛管理界面
管理员点击“历史比赛”会显示出所有的历史比赛信息,支持通过参赛选手或者比赛名称对历史比赛信息进行查询,如果想要添加新的历史比赛信息,点击“添加”按钮,输入相关信息,点击“提交”按钮就可以添加了,同时可以选择某一条历史比赛信息,点击“删除”进行删除。界面如下图4-11所示。
图4-11历史比赛管理界面图
历史比赛管理关键代码如下:
def Set(self, ctx):
error = self.Set_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("set_before", ctx, None)
if error["code"]:
return {"error": error}
query = ctx.query
if 'page' in query.keys():
del ctx.query['page']
if 'size' in query.keys():
del ctx.query['size']
if 'orderby' in query.keys():
del ctx.query['orderby']
result = self.service.Set(ctx.query, ctx.body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Set_after(ctx, result)
if res:
result = res
res = self.Events("set_after", ctx, result)
if res:
result = res
return {"result": result}
4.2.5系统管理界面
管理员点击“轮播图管理”菜单可以查看到系统中的所有轮播图信息,对已经存在的轮播图,管理员可以修改,也可以添加新的轮播图或者删除轮播图。界面如下图4-12所示。
图4-12 系统管理界面图
4.2.6通知公告管理界面
管理员点击“通知公告管理”菜单可以查看到系统中的所有通知公告信息,对已经存在的公告,管理员可以修改,也可以添加新的公告信息或者删除公告信息。界面如下图4-13所示。
图4-13 通知公告管理界面图