2024基于SSM的高校体育馆场地预约管理系统-JAVA.VUE

本文详细介绍了高校体育馆场地预约管理系统的系统设计,包括三层架构、设计原则(如安全性、标准化等)、功能结构(管理员和用户功能)、数据库设计(E-R图、MySQL选择)及其实现示例。着重展示了数据库表设计和后端JAVA代码片段,为读者提供了一个完整的系统开发案例。
摘要由CSDN通过智能技术生成

  博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到

🔎千套JAVA项目实战持续更新中~

🔎百套小程序APP项目实战持续更新中~

🔎百套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 系统实现

当需要描述系统具体实现的功能点的时候,一方面肯定是要用文字表达实现的功能,另一方面完全可以从系统的具体实现页面把可以用文字描述的操作界面以图片的形式放到文字的下方,这样的表达方式可谓之言之有物,更容易理解系统实现的功能部分。

5.1 管理员功能实现

5.1.1 场地管理

 图5.1展示的是场地管理界面。

图5.1 场地管理界面

此界面展示了场地名称,场地位置,场地原价,场地热度等信息。每条场地信息的右侧区域都展示了可供管理员选择的操作,包括上架场地,下架场地,修改,删除等。

5.1.2 场地评价管理

 图5.2展示的是场地评价管理界面。

图5.2 场地评价管理界面

此界面展示了用户发布的对场地的评价信息,该评价信息显示在前台相对应的场地介绍信息界面供其他用户作为参考信息。此界面展示的每条场地评价信息都允许管理员进行回复,删除等操作。

5.1.3 场地预约管理

 图5.3展示的是场地预约管理界面。

图5.3 场地预约管理界面

此界面展示了场地预约的编号,场地预约的日期,预约状态,场地照片等信息。如果是用户刚刚提交的场地预约信息,则需要管理员及时查看和审核。

JAVA后端代码实现

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();
    }
}

源码获取

大家点赞、收藏、关注 ,让更多需要的同学看到

不同开发语言专栏推荐订阅

 🔎千套JAVA项目实战持续更新中~

🔎百套小程序APP项目实战持续更新中~

🔎百套Python实战项目持续更新中~

👇下方有我的微信名片👇

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值