基于Vue+Nodejs+Springboot实现冬奥滑雪场地管理系统

简介: 鉴于 2022 北京冬奥会的成功举行,我国人民对于冰雪运动的热爱达到了前所未有的一个高度,国内各大滑雪场的人流量日益增大,而国内疫情形式依旧严峻,固为减少人们线下购票带来的密接影响,我们小组便开发了一个 online 的滑雪场信息网站.供用户以及滑雪场工作人员进行使用,旨在提升服务效率与用户体验。

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

文末获取源码

一,项目简介

鉴于 2022 北京冬奥会的成功举行,我国人民对于冰雪运动的热爱达到了前所未有的一

个高度,国内各大滑雪场的人流量日益增大,而国内疫情形式依旧严峻,固为减少人们线下

购票带来的密接影响,我们小组便开发了一个 online 的滑雪场信息网站.供用户以及滑雪场

工作人员进行使用,旨在提升服务效率与用户体验。

序号

名称

功能模块

1

首页信息展示

首页信息展示,主要包括了导航栏的展示,以及最新的雪具推荐列表的展示,场地列表的推荐,同时首页还包括站内的最新公告,以及当地的天气情况。

2

登录与注册

用户可在首页点击登录注册按钮进入登录注册页面,通过手机号进行注册,同时在注册后跳转至登录界面,登录成功后重新进入首页。

3

在线订票

已登录的用户可通过点击首页的推荐票或者导航栏的购买,进入场地票的详情列表页,可通过点击用户喜欢的场地票进行订票。未登录用户请求会被拦截。

4

在线评论及查看

游客(未登录的用户)可查看网站的所有评论信息(包括评论内容、评论者、日期),但不能在线评论,而已登录的用户除查看外,可进行在线评论。

5

场地信息详情

用户通过点击首页的场地推荐中的更多可进入场地的详情列表页,在此页面中,用户可清晰的看见场地的有关简介,以及人气值,和场地票的余数

6

雪具租赁

在进行场地票的预定时,旁边有雪具租赁的选项界面,对于有需求的用户可选择适合自己的品牌和尺寸的雪具进行租借,该界面会显示价格以及雪具的余量,当余量为0时,不可选取对应雪具

7

场地搜索

在页面的左上角有对应的搜索框,用户可通过搜索框进行场地的搜索。

8

后台管理

管理员在进行登录注册后,可进入后台,进行有关的管理,包括(用户管理、评论(留言)管理、雪具管理、订单管理、公告管理)

9

个人信息管理

已登录的用户可点击页面上的头像进入个人信息页面,在此页面用户可查看个人基本信息以及个人的订单查看,同时可进行有关的信息更改,例如头像的更换、密码的修改、会员的充值(默认的注册用户为普通用户)。

根据当前对本系统改版需求的理解,本章对用户角色进行分析,对系统将要支持的核心业务流程进行描述,说明系统的子系统或功能模块的组成,并展示部分用户界面的示意图。

本方案的其它内容都是基于对业务需求的理解。随着对需求理解越来越深入和清晰,技术方案和工作量估算等将会发生变化。

以下为本系统的整体架构:

image.gif编辑

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术后台:Springboot+Mybatis

开发技术前台:Vue+Nodejs+ElementUI

三,系统展示

前端展示:

前端用户登陆

image.gif编辑

留言

image.gif编辑

个人中心

image.gif编辑

最新资讯

image.gif编辑

后台管理系统

image.gif编辑

用户管理

image.gif编辑

公告管理

image.gif编辑

留言管理

image.gif编辑

雪具管理

image.gif编辑

订单管理

image.gif编辑

四,核心代码展示

package com.cupk.controller;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cupk.common.dto.UserDto;
import com.cupk.common.lang.Result;
import com.cupk.entity.User;
import com.cupk.service.UserService;
import com.cupk.util.JwtUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@RestController
public class AccountController {
    @Autowired
    UserService userService;
    @Autowired
    JwtUtils jwtUtils;
    private String salt = "2000.10.22";
    /**
     * 用户登陆
     * @param userDto
     * @param response
     * @return
     */
    @PostMapping("/login")
    public Result login(@Validated @RequestBody UserDto userDto, HttpServletResponse response){
        User user = userService.getOne(new QueryWrapper<User>().eq("phone", userDto.getPhone()));
        Assert.notNull(user,"用户不存在");//断言拦截
        //判断账号密码是否错误 因为是md5加密所以这里md5判断
        if(!user.getPassword().equals(SecureUtil.md5(userDto.getPassword()+salt))){
            //密码不同则抛出异常
            return Result.fail("密码不正确");
        }
        String jwt = jwtUtils.generateToken(user.getId());
        userDto.setImg(user.getImg());
        userDto.setToken(jwt);
        //将token 放在入header里面
        response.setHeader("Authorization",jwt);
        response.setHeader("Access-control-Expose-Headers","Authorization");
        return Result.succ(200,"登录成功",userDto);
    }
    /**
     * 退出登录
     * @return
     */
    //需要认证权限才能退出登录
    @RequiresAuthentication
    @RequestMapping("/logout")
    public Result logout() {
        //退出登录
        SecurityUtils.getSubject().logout();
        return Result.succ("退出成功");
    }
}

image.gif

package com.cupk.controller;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cupk.common.dto.AdminDto;
import com.cupk.common.lang.Result;
import com.cupk.entity.Admin;
import com.cupk.service.AdminService;
import com.cupk.util.JwtUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    AdminService adminService;
    @Autowired
    JwtUtils jwtUtils;
    /**
     * 管理员登陆
     * @param adminDto
     * @param response
     * @return
     */
    @PostMapping("/adminLogin")
    public Result adminLogin(@Validated @RequestBody AdminDto adminDto, HttpServletResponse response){
        Admin admin = adminService.getOne(new QueryWrapper<Admin>().eq("admin_name", adminDto.getAdminName()));
        Assert.notNull(admin,"管理员不存在");//断言拦截
        if(!adminDto.getAdminPwd().equals(admin.getAdminPwd())){
            //密码不同则抛出异常
            return Result.fail("密码不正确");
        }
        String jwt = jwtUtils.generateToken(admin.getId());
        adminDto.setToken(jwt);
        //将token 放在我们的header里面
        response.setHeader("Authorization",jwt);
        response.setHeader("Access-control-Expose-Headers","Authorization");
        return Result.succ(200,"success",adminDto);
    }
    //需要认证权限才能退出登录
    /**
     * 管理员退出登陆
     * @return
     */
    @RequiresAuthentication
    @RequestMapping("/adminLogout")
    public Result adminLogout() {
        //退出登录
        SecurityUtils.getSubject().logout();
        return Result.succ("退出成功");
    }
    @GetMapping("/adminInfo")
    public Result findAdminInfoByName(@RequestParam String adminName){
        Admin admin = adminService.getOne(new QueryWrapper<Admin>().eq("admin_name",adminName));
        return Result.succ(200,"查询成功", admin);
    }
}

image.gif

package com.cupk.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cupk.common.lang.Result;
import com.cupk.entity.Evaluate;
import com.cupk.entity.Notice;
import com.cupk.service.EvaluateService;
import com.cupk.util.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RequestMapping("/evaluate")
@RestController
public class EvaluateController {
    @Autowired
    EvaluateService evaluateService;
    /**
     * 评论列表
     * @return
     */
    @GetMapping("/evaluates")
    public Result evaList(@RequestParam(defaultValue = "1") Integer currentPage) {
        if(currentPage == null || currentPage < 1) currentPage = 1;
        Page page = new Page(currentPage, 50000);
        QueryWrapper<Evaluate> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("uid","");
        queryWrapper.orderByDesc("e_time");
        IPage pageData = evaluateService.page(page,queryWrapper.orderByDesc("e_time"));
        return Result.succ(pageData);
    }
    /**
     * 根据评论id查询
     * @param id
     * @return
     */
    @GetMapping("/evaluate/{id}")
    public Result findEva(@PathVariable Integer id) {
        Evaluate evaluate = evaluateService.getById(id);
        //判断是否为空 为空则断言异常
        Assert.notNull(evaluate, "该评价不存在");
        return Result.succ(evaluate);
    }
    /**
     *
     * @param currentPage
     * @param uid
     * @return
     */
    @GetMapping("/findEva")
    public Result evaLists(@RequestParam(defaultValue = "1") Integer currentPage,
                            @RequestParam(defaultValue = "") Integer uid){
        if(currentPage == null || currentPage < 1) currentPage = 1;
        Page page = new Page(currentPage, 50000);
        QueryWrapper<Evaluate> queryWrapper = new QueryWrapper();
        queryWrapper.eq("uid",uid);
        IPage pageData = evaluateService.page(page,queryWrapper.orderByDesc("e_time"));
        return Result.succ(pageData);
    }
    /**
     * 评论分页
     */
    @GetMapping("/evaluateList")
    public Result evalueList(@RequestParam(defaultValue = "1") Integer pageNum,
                           @RequestParam(defaultValue = "5") Integer pageSize,
                           @RequestParam(defaultValue = "") Integer uid) {
        if (pageNum == null || pageNum < 1) pageNum = 1;
        Page page = new Page(pageNum, pageSize);
        QueryWrapper<Evaluate> queryWrapper = new QueryWrapper();
        if (uid!=null) {
            queryWrapper.like("uid", uid);
        }
        IPage pageData = evaluateService.page(page, queryWrapper.orderByAsc("e_time"));
        return Result.succ(pageData);
    }
    /**
     * 添加评论
     * @param evaluate
     * @return
     */
    @RequiresAuthentication
    @PostMapping("/evaluate/addEva")
    public Result edit(@Validated @RequestBody Evaluate evaluate) {
        //一个空对象用于赋值
        Evaluate temp = new Evaluate();
        if (evaluate.getId() != null) {
            temp = evaluateService.getById(evaluate.getId());//将数据库的内容传递给temp
        } else {
            temp.setUid(ShiroUtil.getProfile().getId());
            temp.setUname(ShiroUtil.getProfile().getNickname());
            temp.setUImg(ShiroUtil.getProfile().getImg());
            temp.setContent(evaluate.getContent());
            temp.setETime(evaluate.getETime());
        }
        BeanUtil.copyProperties(evaluate, temp);
        evaluateService.save(temp);
        return Result.succ("成功发表评价");
    }
    /**
     * 单个删除
     * @param id
     * @return
     */
    @DeleteMapping("/delEva")
    public boolean delEvaList(@RequestParam Integer id){
        return evaluateService.removeById(id);
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @PostMapping("/delEvas")
    public boolean delEvaList(@RequestBody(required = false) List<Integer> ids){
        return evaluateService.removeByIds (ids);
    }
}

image.gif

package com.cupk.controller;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cupk.common.lang.Result;
import com.cupk.entity.Gear;
import com.cupk.service.GearService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * 雪具相关接口
 */
@RestController
@RequestMapping("/gear")
public class GearController {
    @Autowired
    GearService gearService;
    /**
     * 雪具列表
     * @param pageNum
     * @param brand
     * @param category
     * @return
     */
    @GetMapping("/gears")
    public Result gearList(@RequestParam(defaultValue = "1") Integer pageNum,
                           @RequestParam(defaultValue = "2") Integer pageSize,
                           @RequestParam(defaultValue = "") String brand,
                           @RequestParam(defaultValue = "") String category,
                           @RequestParam(defaultValue = "") String size){
        if(pageNum == null || pageNum < 1) pageNum = 1;
        Page page = new Page(pageNum,  pageSize);
        QueryWrapper<Gear> queryWrapper = new QueryWrapper();
        if (!"".equals(brand)){
            queryWrapper.like("brand",brand);
        }
        if (!"".equals(category)){
            queryWrapper.like("category",category);
        }
        if(!"".equals(size)){
            queryWrapper.like("size",size);
        }
        IPage pageData = gearService.page(page,queryWrapper.orderByAsc("brand"));
        return Result.succ(pageData);
    }
    /**
     * 编辑雪具信息
     * @param gear
     * @return
     */
    @PostMapping("/edit")
    public Result edit(@Validated @RequestBody Gear gear) {
        //一个空对象用于赋值
        Gear temp = null;
        //如果有id则是编辑
        if (gear.getId() != null) {
            temp = gearService.getById(gear.getId());//将数据库的内容传递给temp
        } else {
            temp = new Gear();
            temp.setBrand(gear.getBrand());
            temp.setCategory(gear.getCategory());
            temp.setDeposit(gear.getDeposit());
            temp.setGImg(gear.getGImg());
            temp.setSize(gear.getSize());
            temp.setStock(gear.getStock());
            temp.setRent(gear.getRent()) ;
        }
        BeanUtil.copyProperties(gear, temp);
        gearService.saveOrUpdate(temp);
        return Result.succ("修改成功");
    }
    /**
     * 单个删除
     * @param id
     * @return
     */
    @DeleteMapping("/delGear")
    public boolean delEvaList(@RequestParam Integer id){
        return gearService.removeById(id);
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @PostMapping ("/delGears")
    public boolean delEvaList(@RequestBody(required = false) List<Integer> ids){
        return gearService.removeByIds (ids);
    }
}

image.gif

五,项目总结

项目基本功能完整,立意新颖,前后端分离开发的模式也是现在主流的开发方式,适合做毕业设计使用

相关文章
|
3天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
32 13
|
25天前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
26 2
2024年5月node.js安装(winmac系统)保姆级教程
|
10天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
69 2
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
40 0
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
172 1
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
176 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
3月前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
277 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
111 62
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。