博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1500+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍 翰文编程CSDN博客 翰文编程-CSDN博客
文末下方有源码获取地址
4.2 功能结构设计
图4.1即为设计的管理员功能结构,管理员权限操作的功能包括对课程,课程报名,教练,会员,公告,论坛帖子,留言等信息的管理。
图4.1 管理员功能结构
图4.2即为设计的教练功能结构,教练权限操作的功能包括管理论坛帖子,查看会员,查看课程信息,查看课程报名信息等。
图4.2 教练功能结构
图4.3即为设计的会员功能结构,会员权限操作的功能包括查看教练,对课程进行报名,管理课程报名信息,查看留言,在在线论坛模块发帖以及评论帖子等。
图4.3 会员功能结构
4.3 数据库设计
游泳会员管理系统运行中产生的数据需要按照提前设置的存储规则进行保存,设计出一个符合项目的最优数据存储格式,因为它能减少用户的等待时间,还可以对系统的请求在最短时间内进行响应。所以,对数据库设计时,需要对功能需求进行详细的拆分,以及对业务状态的细分,然后设计具体的存储规则,保证数据库能正常运作,缩短数据处理时间,并在一定程度上降低数据冗余,节省存储空间。
4.3.1 数据库概念设计
实体-联系图还有一个名称即E-R图,是Entity Relationship Diagram各英文单词首字母的缩写,它这种概念模型通常用于对现实世界进行描述。同时它还是一种能够直观表达数据中实体,联系,属性的有效手段。绘制E-R图能够选择的工具也有很多,但是Office Visio 这款软件在E-R图的绘制上一般都是作为首选工具,因为它是基于可视化处理,使用它创建E-R图非常简单。使用基本的E-R图构成元素,比如椭圆,菱形,矩形,还有实线段来表达对应的信息,椭圆代表属性,即实体的特征,矩形代表实体,即数据库中的一个具体数据表,菱形代表实体中相互关系,实线段主要是完成椭圆,矩形,菱形的连接。
(1)图4.4即为课程这个实体所拥有的属性值。
图4.4 课程实体属性图
(2)图4.5即为管理员这个实体所拥有的属性值。
图4.5 管理员实体属性图
(3)图4.6即为教练这个实体所拥有的属性值。
图4.6 教练实体属性图
- 图4.7即为会员这个实体所拥有的属性值。
图4.7 会员实体属性图
- 图4.8即为上面介绍的实体中存在的联系。
图4.8 实体间关系E-R图
4.3.2 数据库物理设计
本小节主要任务即是根据上述内容进行数据存储结构的设计,实体的属性就用来表示字段名称,不同的字段表示的数据类型以及取值都不相同,以及该表各个字段是否能够保持空等进行说明,设计完成一张数据表的结构之后,在保存时同样要命名,尽量选择英文名称进行命名并保存,还不容易导致系统出错。接下来就对设计的表进行简单说明。
表4.1 论坛表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
forum_name | 帖子标题 | varchar(200) | 是 |
jiaolian_id | 教练 | int(11) | 是 |
yonghu_id | 会员 | int(11) | 是 |
users_id | 管理员 | int(11) | 是 |
forum_content | 发布内容 | text | 是 |
super_ids | 父id | int(11) | 是 |
forum_state_types | 帖子状态 | int(11) | 是 |
insert_time | 发帖时间 | timestamp | 是 |
update_time | 修改时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.2 教练表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
username | 账户 | varchar(200) | 是 |
password | 密码 | varchar(200) | 是 |
jiaolian_name | 教练姓名 | varchar(200) | 是 |
jiaolian_photo | 头像 | varchar(255) | 是 |
sex_types | 性别 | int(11) | 是 |
jiaolian_phone | 联系方式 | varchar(200) | 是 |
jiaolian_email | 邮箱 | varchar(200) | 是 |
jiaolian_delete | 假删 | int(11) | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.3 课程信息表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
kecheng_uuid_number | 课程编号 | varchar(200) | 是 |
kecheng_name | 课程标题 | varchar(200) | 是 |
kecheng_types | 课程类型 | int(11) | 是 |
kecheng_photo | 课程封面 | varchar(200) | 是 |
jiaolian_id | 教练 | int(11) | 是 |
kecheng_date | 课程时间 | varchar(200) | 是 |
kecheng_new_money | 课程价格 | decimal(10,2) | 是 |
kecheng_content | 课程详情 | text | 是 |
insert_time | 添加时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.4 课程报名表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
kecheng_id | 报名课程 | int(11) | 是 |
yonghu_id | 会员 | int(11) | 是 |
insert_time | 报名时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.5 留言表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
yonghu_id | 用户 | int(11) | 是 |
liuyan_name | 留言标题 | varchar(200) | 是 |
liuyan_text | 留言内容 | text | 是 |
insert_time | 留言时间 | timestamp | 是 |
reply_text | 回复内容 | text | 是 |
update_time | 回复时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.6 公告信息表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
news_name | 公告标题 | varchar(200) | 是 |
news_types | 公告类型 | int(11) | 是 |
news_photo | 公告图片 | varchar(200) | 是 |
insert_time | 公告时间 | timestamp | 是 |
news_content | 公告详情 | text | 是 |
create_time | 创建时间 | timestamp | 是 |
表4.7 管理员表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
username | 用户名 | varchar(100) | 否 |
password | 密码 | varchar(100) | 否 |
role | 角色 | varchar(100) | 是 |
addtime | 新增时间 | timestamp | 否 |
表4.8 会员表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
username | 账户 | varchar(200) | 是 |
password | 密码 | varchar(200) | 是 |
yonghu_name | 会员姓名 | varchar(200) | 是 |
yonghu_photo | 头像 | varchar(255) | 是 |
sex_types | 性别 | int(11) | 是 |
yonghu_phone | 联系方式 | varchar(200) | 是 |
yonghu_email | 邮箱 | varchar(200) | 是 |
huiyuan_types | 会员类型 | int(11) | 是 |
yonghu_delete | 假删 | int(11) | 是 |
create_time | 创建时间 | timestamp | 是 |
编程人员在搭建的开发环境中,会让各种编程技术一起呈现出最终效果。本节就展示关键部分的页面效果。
5.1 管理员功能实现
5.1.1 教练管理
图5.1 即为编码实现的教练管理界面,管理员对教练的基础信息包括邮箱,联系方式等进行更改,查询,删除需要删除的教练信息,同时可以为教练的账号进行密码重置。
图5.1 教练管理界面
5.1.2 会员管理
图5.2 即为编码实现的会员管理界面,管理员增删改查会员资料。为会员的账号重置密码。
图5.2 会员管理界面
5.1.3 课程信息管理
图5.3 即为编码实现的课程信息管理界面,管理员发布课程,删除需要删除的课程,更改课程信息,包括更改课程时间,课程价格,课程类型等信息。
图5.3 课程信息管理界面
5.2 教练功能实现
5.2.1 论坛管理
图5.4 即为编码实现的论坛管理界面,教练在论坛管理界面中具备新增论坛帖子,查看论坛帖子回复,删除帖子以及发布回帖等权限。
图5.4 论坛管理界面
5.2.2 课程报名查看
图5.5 即为编码实现的课程报名查看界面,教练查看会员报名的课程信息,查看报名课程的价格,课程类型等信息,可以根据会员的姓名来实现对报名课程信息的查询等。
图5.5 课程报名查看界面
主要代码
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("会员".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
else if("教练".equals(role))
params.put("jiaolianId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = kechengbaomingService.queryPage(params);
//字典表数据转换
List<KechengbaomingView> list =(List<KechengbaomingView>)page.getList();
for(KechengbaomingView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
KechengbaomingEntity kechengbaoming = kechengbaomingService.selectById(id);
if(kechengbaoming !=null){
//entity转view
KechengbaomingView view = new KechengbaomingView();
BeanUtils.copyProperties( kechengbaoming , view );//把实体数据重构到view中
//级联表
KechengEntity kecheng = kechengService.selectById(kechengbaoming.getKechengId());
if(kecheng != null){
BeanUtils.copyProperties( kecheng , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setKechengId(kecheng.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(kechengbaoming.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody KechengbaomingEntity kechengbaoming, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,kechengbaoming:{}",this.getClass().getName(),kechengbaoming.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("会员".equals(role))
kechengbaoming.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<KechengbaomingEntity> queryWrapper = new EntityWrapper<KechengbaomingEntity>()
.eq("kecheng_id", kechengbaoming.getKechengId())
.eq("yonghu_id", kechengbaoming.getYonghuId())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
KechengbaomingEntity kechengbaomingEntity = kechengbaomingService.selectOne(queryWrapper);
if(kechengbaomingEntity==null){
kechengbaoming.setInsertTime(new Date());
kechengbaoming.setCreateTime(new Date());
kechengbaomingService.insert(kechengbaoming);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody KechengbaomingEntity kechengbaoming, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,kechengbaoming:{}",this.getClass().getName(),kechengbaoming.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("会员".equals(role))
// kechengbaoming.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper<KechengbaomingEntity> queryWrapper = new EntityWrapper<KechengbaomingEntity>()
.notIn("id",kechengbaoming.getId())
.andNew()
.eq("kecheng_id", kechengbaoming.getKechengId())
.eq("yonghu_id", kechengbaoming.getYonghuId())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
KechengbaomingEntity kechengbaomingEntity = kechengbaomingService.selectOne(queryWrapper);
if(kechengbaomingEntity==null){
kechengbaomingService.updateById(kechengbaoming);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
kechengbaomingService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
5.2.3 会员查看
图5.6 即为编码实现的会员查看界面,教练查看会员类型,会员联系方式,会员姓名等信息。教练查询会员可以选择性别查询,可以选择会员类型查询,可以提供会员姓名查询等。
图5.6 会员查看界面
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者