Bootstrap

基于ssm+vue650游泳会员管理系统设计与实现

博主介绍:专注于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 教练实体属性图

  1. 图4.7即为会员这个实体所拥有的属性值。

图4.7 会员实体属性图

  1. 图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 系统实现

编程人员在搭建的开发环境中,会让各种编程技术一起呈现出最终效果。本节就展示关键部分的页面效果。

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 会员查看界面

大家点赞、收藏、关注、评论啦  其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者

;