博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到🔎上百套Python实战项目持续更新中
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我❤️文末获取源码联系❤️ ⚠️一定要先收藏⚠️
第4章 系统设计
4.1系统整体设计方案
高校体育馆场地预约管理系统的设计在体系结构模式的选择上还是比较青睐于用户层,功能层和数据层这样的三层结构,俗称B/S结构。这种结构模式在Internet兴起之后,大部分的应用程序都会将其作为首选结构设计模式。
(1)用户层:高校体育馆场地预约管理系统的使用人员通常在用户层登录系统,使用系统,对数据的输入和输出进行处理;
(2)功能层:在用户层和数据层的中间,就分布着功能层,功能层主要就是把用户的请求以SQL语句的方式来对数据库进行检索,最终将数据检索的结果传递给用户层;
(3)数据层:数据层主要就是实现对数据库的操作,一般都是增加,修改,删除,查找数据。每当数据层接收到来自上层的数据操作请求时,就会根据该指令去操作数据库,最终反馈给上层执行结果。
4.2系统设计原则
设计系统期间,需要参照以下原则进行,主要包括安全性原则,标准化原则,稳定性原则等。
(1)先进性原则。高校体育馆场地预约管理系统无论是体系结构的选择还是技术的选择上应该认真考虑,技术上可以首选当前环境下的先进技术,体系结构上主要采用成熟的设计结构,同时在保持系统技术上的先进性时,对目前市场上的各种操作系统还有各种软件以及硬件环境要充分适应。
(2)标准化原则。高校体育馆场地预约管理系统在管理相应数据期间需要符合相应的工作模式,对国家规范软件工程设计方面提出的要求一定要遵守。
(3)实用性原则。本系统以用户的功能需求为核心进行开发,要解决用户需要解决的实质性问题,同时高效完成对各种数据的处理,此外,设计的界面需要满足用户的操作习惯并且界面友好,让用户方便操作本系统。
(4)可扩展性原则。本系统在开发期间应该预留各种接口,方便系统经过长时间使用之后,为了持续满足用户的不断变化的需求而进行系统功能扩展和升级。
(5)稳定性原则。通过各种技术手段的实施让该系统可以承受7×24小时不间断运行,并在长期使用后,对产生的大量数据有较强的存储能力,因此可以对系统的数据库或者系统采用的网络协议以及使用的操作系统等进行规范,让系统可以稳定运行。
(6)安全性原则。对于本系统保存的数据一定要做好保密措施,在保证数据安全不被泄露的同时,也要对外在的黑客攻击等行为进行防范,保证系统安全。
4.3功能结构设计
前面对高校体育馆场地预约管理系统的功能需求的分析只是大致的划分功能模块,接下来的工作就是对这些大致的功能进行细分。让高校体育馆场地预约管理系统的内容变得更具体,更丰富。
(1)管理员功能结构设计
图4.1展示的是管理员功能结构。系统将管理员的个人中心模块划分为个人信息管理与修改密码子模块,将基础数据管理功能划分为场地类型管理,公告类型管理,校区管理子模块。将场地管理功能划分为场地管理,场地评价管理,场地收藏管理,场地预约管理子模块。
图4.1管理员功能结构
(2)用户功能结构设计
图4.2展示的是用户功能结构。系统将用户的个人中心模块划分为更改个人信息,场地收藏,场地预约子模块,用户的主要任务还是浏览各种各样的场地信息,预约需要的场地,以及对预约的场地进行管理等。
图4.2用户功能结构
4.4数据库设计
数据库的设计是对系统相关数据要求的具体设计。需要对各个对象进行数据类型具体化,比如每个表都要有自己的主键,有些关键性数据不可以直接采用删除操作,只能采用伪装删除的操作,比如专门设置一个字段就是删除标记字段,默认没删除就是0,如果已经删除则设置为1,这样如果有大量数据的删除,只需要更新相关字段的值就行,不需要大量的对磁盘进行删除操作,在性能上面有很大的提升。目前市场上主流的数据库基本上都符合设计的功能需求,但是一切要根据实际出发,首先开发使用的电脑是自己上学用的,那么首选对电脑性能要求没那么高的数据库,其次尽量使用自己曾经学习过的数据库,这样学习成本会降低,时间上就有空余的时间来安排其他事情。本系统通过数据库设计相关的分析,采用MySQL数据库。
4.4.1数据库概念设计
有一个专门用来描述数据库实体与参数之间的图叫做E-R图,E-R是英文缩写,经过多年的传播,已经变成了数据库实体之间联系的专业名字,一般都用缩写E-R图表示,不再采用英文全称。现实世界有很多相关的数据,如何应用到数据库存放就需要进行归类,实体与属性之间的关系不能混淆,一个实体可以有多个属性,一个属性可能对应多个实体,实体和属性之间的关系是需要用图的形式进行描述的,不然不直观。采用Visio画图工具来画E-R图是一种很明智的选择。Visio是专门用来画图的工具之一,内置了很多图形选项,画E-R图用Visio画是正确的,Visio画的图形可以进行保存,复制到其他地方还可以进行编辑,如果缺少某些属性可以直接用Visio打开进行修改,是非常方便的。接下来展示本系统的部分实体图以及实体关系E-R图。
4.4.2数据库物理设计
二维表是传统的用来记录相关表与属性之间关系的一种专业图表。表里面每个字段名称都是唯一的,代表当前表的某一个唯一的属性,如果有多个属性,那么就会多几个字段来进行描述。二维表的概念如下:
关键字:每个表建议有且只有一个主键,用来表达数据的专一性和唯一性。也可以通过设定的关键字与其他表进行关联。
元组:二维表显示数据有行与列的关系,行是可以增加的,列是提前设定好的,每一行数据成为元组。
属性:列的名称一般称为属性,也就是字段,比如一个正常人拥有的属性必然有姓名,性别,不管是姓名还是性别,都可以称之为属性。
关系:有列有行只是一张二维表的表达,这张二维表的名称就是行与列的关系,比如用户表,比如有用户账号的属性也就是列,用户的姓名属性也是列,用户属性都有成为元组,很多用户都在这个表里之间的关系成为用户表。
以上内容表示数据之间的关系,通过对数据进行分析和归纳,二维表用来描述和存储相关数据。高校体育馆场地预约管理系统数据表设计结果展示如下:
表4.1 场地表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
changdi_name | varchar(200) | 场地名称 | 允许空 |
changdi_uuid_number | varchar(200) | 场地编号 | 允许空 |
changdi_photo | varchar(200) | 场地照片 | 允许空 |
changdi_address | varchar(200) | 场地位置 | 允许空 |
changdi_types | int(11) | 场地类型 | 允许空 |
xiaoqu_types | int(11) | 校区 | 允许空 |
changdi_old_money | decimal(10,2) | 场地原价 | 允许空 |
changdi_new_money | decimal(10,2) | 现价/天 | 允许空 |
changdi_clicknum | int(11) | 场地热度 | 允许空 |
changdi_content | longtext | 场地介绍 | 允许空 |
shangxia_types | int(11) | 是否上架 | 允许空 |
changdi_delete | int(11) | 逻辑删除 | 允许空 |
insert_time | timestamp | 录入时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.2 用户表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
username | varchar(200) | 账户 | 允许空 |
password | varchar(200) | 密码 | 允许空 |
yonghu_name | varchar(200) | 用户姓名 | 允许空 |
yonghu_phone | varchar(200) | 用户手机号 | 允许空 |
yonghu_id_number | varchar(200) | 用户身份证号 | 允许空 |
yonghu_photo | varchar(200) | 用户头像 | 允许空 |
sex_types | int(11) | 性别 | 允许空 |
yonghu_email | varchar(200) | 用户邮箱 | 允许空 |
new_money | decimal(10,2) | 余额 | 允许空 |
jinyong_types | int(11) | 账户状态 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.3 场地评价表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
changdi_id | int(11) | 场地 | 允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
changdi_commentback_text | longtext | 评价内容 | 允许空 |
insert_time | timestamp | 评价时间 | 允许空 |
reply_text | longtext | 回复内容 | 允许空 |
update_time | timestamp | 回复时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.4 留言板表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
liuyan_name | varchar(200) | 留言标题 | 允许空 |
liuyan_text | longtext | 留言内容 | 允许空 |
insert_time | timestamp | 留言时间 | 允许空 |
reply_text | longtext | 回复内容 | 允许空 |
update_time | timestamp | 回复时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.5 场地预约表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
changdi_order_uuid_number | varchar(200) | 预约编号 | 允许空 |
changdi_id | int(11) | 场地 | 允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
changdi_order_time | date | 预约日期 | 允许空 |
changdi_order_true_price | decimal(10,2) | 花费金额 | 允许空 |
changdi_order_types | int(11) | 预约状态 | 允许空 |
changdi_order_payment_types | int(11) | 支付类型 | 允许空 |
insert_time | timestamp | 申请时间 | 允许空 |
changdi_order_yesno_types | int(11) | 审核状态 | 允许空 |
changdi_order_yesno_text | longtext | 审核意见 | 允许空 |
changdi_order_shenhe_time | timestamp | 审核时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.6 公告表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
gonggao_name | varchar(200) | 公告名称 | 允许空 |
gonggao_photo | varchar(200) | 公告图片 | 允许空 |
gonggao_types | int(11) | 公告类型 | 不允许空 |
insert_time | timestamp | 公告发布时间 | 允许空 |
gonggao_content | longtext | 公告详情 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.7 管理员表
字段 | 类型 | 说明 | 允许空 |
id (主键) | bigint(20) | 主键 | 不允许空 |
username | varchar(100) | 用户名 | 不允许空 |
password | varchar(100) | 密码 | 不允许空 |
role | varchar(100) | 角色 | 允许空 |
addtime | timestamp | 新增时间 | 不允许空 |
当需要描述系统具体实现的功能点的时候,一方面肯定是要用文字表达实现的功能,另一方面完全可以从系统的具体实现页面把可以用文字描述的操作界面以图片的形式放到文字的下方,这样的表达方式可谓之言之有物,更容易理解系统实现的功能部分。
5.1 管理员功能实现
5.1.1 场地管理
图5.1展示的是场地管理界面。
图5.1 场地管理界面
此界面展示了场地名称,场地位置,场地原价,场地热度等信息。每条场地信息的右侧区域都展示了可供管理员选择的操作,包括上架场地,下架场地,修改,删除等。
5.1.2 场地评价管理
图5.2展示的是场地评价管理界面。
图5.2 场地评价管理界面
此界面展示了用户发布的对场地的评价信息,该评价信息显示在前台相对应的场地介绍信息界面供其他用户作为参考信息。此界面展示的每条场地评价信息都允许管理员进行回复,删除等操作。
5.1.3 场地预约管理
图5.3展示的是场地预约管理界面。
图5.3 场地预约管理界面
此界面展示了场地预约的编号,场地预约的日期,预约状态,场地照片等信息。如果是用户刚刚提交的场地预约信息,则需要管理员及时查看和审核。
代码实现
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UserController{
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
return R.error("用户名已存在。");
}
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
源码获取
大家点赞、收藏、关注 ,让更多需要的同学看到
不同开发语言专栏推荐订阅:
👇下方有我的微信名片👇