• 1024程序员节|基于Vue+Nodejs+Springboot实现冬奥滑雪场地管理系统


    作者主页:编程千纸鹤

    作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师

    主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

    在即将到来的1024程序员节,谨以此文献给CSDN和亲爱的同行们。

    一,项目简介

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

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

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

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

    序号

    名称

    功能模块

    1

    首页信息展示

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

    2

    登录与注册

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

    3

    在线订票

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

    4

    在线评论及查看

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

    5

    场地信息详情

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

    6

    雪具租赁

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

    7

    场地搜索

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

    8

    后台管理

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

    9

    个人信息管理

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

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

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

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

    二,环境介绍

    语言环境:Java:  jdk1.8

    数据库:Mysql: mysql5.7

    应用服务器:Tomcat:  tomcat8.5.31

    开发工具:IDEA或eclipse

    开发技术后台:Springboot+Mybatis

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

    三,系统展示

    前端展示:

     

    前端用户登陆

    留言

    个人中心

    最新资讯

    后台管理系统

    用户管理

    公告管理

    留言管理

    雪具管理

    订单管理

    四,核心代码展示

    1. package com.cupk.controller;
    2. import cn.hutool.core.lang.Assert;
    3. import cn.hutool.core.map.MapUtil;
    4. import cn.hutool.crypto.SecureUtil;
    5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    6. import com.cupk.common.dto.UserDto;
    7. import com.cupk.common.lang.Result;
    8. import com.cupk.entity.User;
    9. import com.cupk.service.UserService;
    10. import com.cupk.util.JwtUtils;
    11. import org.apache.shiro.SecurityUtils;
    12. import org.apache.shiro.authz.annotation.RequiresAuthentication;
    13. import org.springframework.beans.factory.annotation.Autowired;
    14. import org.springframework.validation.annotation.Validated;
    15. import org.springframework.web.bind.annotation.*;
    16. import javax.servlet.http.HttpServletResponse;
    17. @RestController
    18. public class AccountController {
    19. @Autowired
    20. UserService userService;
    21. @Autowired
    22. JwtUtils jwtUtils;
    23. private String salt = "2000.10.22";
    24. /**
    25. * 用户登陆
    26. * @param userDto
    27. * @param response
    28. * @return
    29. */
    30. @PostMapping("/login")
    31. public Result login(@Validated @RequestBody UserDto userDto, HttpServletResponse response){
    32. User user = userService.getOne(new QueryWrapper().eq("phone", userDto.getPhone()));
    33. Assert.notNull(user,"用户不存在");//断言拦截
    34. //判断账号密码是否错误 因为是md5加密所以这里md5判断
    35. if(!user.getPassword().equals(SecureUtil.md5(userDto.getPassword()+salt))){
    36. //密码不同则抛出异常
    37. return Result.fail("密码不正确");
    38. }
    39. String jwt = jwtUtils.generateToken(user.getId());
    40. userDto.setImg(user.getImg());
    41. userDto.setToken(jwt);
    42. //将token 放在入header里面
    43. response.setHeader("Authorization",jwt);
    44. response.setHeader("Access-control-Expose-Headers","Authorization");
    45. return Result.succ(200,"登录成功",userDto);
    46. }
    47. /**
    48. * 退出登录
    49. * @return
    50. */
    51. //需要认证权限才能退出登录
    52. @RequiresAuthentication
    53. @RequestMapping("/logout")
    54. public Result logout() {
    55. //退出登录
    56. SecurityUtils.getSubject().logout();
    57. return Result.succ("退出成功");
    58. }
    59. }

    1. package com.cupk.controller;
    2. import cn.hutool.core.lang.Assert;
    3. import cn.hutool.core.map.MapUtil;
    4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    5. import com.cupk.common.dto.AdminDto;
    6. import com.cupk.common.lang.Result;
    7. import com.cupk.entity.Admin;
    8. import com.cupk.service.AdminService;
    9. import com.cupk.util.JwtUtils;
    10. import org.apache.shiro.SecurityUtils;
    11. import org.apache.shiro.authz.AuthorizationInfo;
    12. import org.apache.shiro.authz.annotation.RequiresAuthentication;
    13. import org.springframework.beans.factory.annotation.Autowired;
    14. import org.springframework.validation.annotation.Validated;
    15. import org.springframework.web.bind.annotation.*;
    16. import javax.servlet.http.HttpServletResponse;
    17. @RestController
    18. @RequestMapping("/admin")
    19. public class AdminController {
    20. @Autowired
    21. AdminService adminService;
    22. @Autowired
    23. JwtUtils jwtUtils;
    24. /**
    25. * 管理员登陆
    26. * @param adminDto
    27. * @param response
    28. * @return
    29. */
    30. @PostMapping("/adminLogin")
    31. public Result adminLogin(@Validated @RequestBody AdminDto adminDto, HttpServletResponse response){
    32. Admin admin = adminService.getOne(new QueryWrapper().eq("admin_name", adminDto.getAdminName()));
    33. Assert.notNull(admin,"管理员不存在");//断言拦截
    34. if(!adminDto.getAdminPwd().equals(admin.getAdminPwd())){
    35. //密码不同则抛出异常
    36. return Result.fail("密码不正确");
    37. }
    38. String jwt = jwtUtils.generateToken(admin.getId());
    39. adminDto.setToken(jwt);
    40. //将token 放在我们的header里面
    41. response.setHeader("Authorization",jwt);
    42. response.setHeader("Access-control-Expose-Headers","Authorization");
    43. return Result.succ(200,"success",adminDto);
    44. }
    45. //需要认证权限才能退出登录
    46. /**
    47. * 管理员退出登陆
    48. * @return
    49. */
    50. @RequiresAuthentication
    51. @RequestMapping("/adminLogout")
    52. public Result adminLogout() {
    53. //退出登录
    54. SecurityUtils.getSubject().logout();
    55. return Result.succ("退出成功");
    56. }
    57. @GetMapping("/adminInfo")
    58. public Result findAdminInfoByName(@RequestParam String adminName){
    59. Admin admin = adminService.getOne(new QueryWrapper().eq("admin_name",adminName));
    60. return Result.succ(200,"查询成功", admin);
    61. }
    62. }

    1. package com.cupk.controller;
    2. import cn.hutool.core.bean.BeanUtil;
    3. import cn.hutool.core.lang.Assert;
    4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    5. import com.baomidou.mybatisplus.core.metadata.IPage;
    6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    7. import com.cupk.common.lang.Result;
    8. import com.cupk.entity.Evaluate;
    9. import com.cupk.entity.Notice;
    10. import com.cupk.service.EvaluateService;
    11. import com.cupk.util.ShiroUtil;
    12. import org.apache.shiro.authz.annotation.RequiresAuthentication;
    13. import org.springframework.beans.factory.annotation.Autowired;
    14. import org.springframework.validation.annotation.Validated;
    15. import org.springframework.web.bind.annotation.*;
    16. import java.util.List;
    17. @RequestMapping("/evaluate")
    18. @RestController
    19. public class EvaluateController {
    20. @Autowired
    21. EvaluateService evaluateService;
    22. /**
    23. * 评论列表
    24. * @return
    25. */
    26. @GetMapping("/evaluates")
    27. public Result evaList(@RequestParam(defaultValue = "1") Integer currentPage) {
    28. if(currentPage == null || currentPage < 1) currentPage = 1;
    29. Page page = new Page(currentPage, 50000);
    30. QueryWrapper queryWrapper = new QueryWrapper<>();
    31. queryWrapper.like("uid","");
    32. queryWrapper.orderByDesc("e_time");
    33. IPage pageData = evaluateService.page(page,queryWrapper.orderByDesc("e_time"));
    34. return Result.succ(pageData);
    35. }
    36. /**
    37. * 根据评论id查询
    38. * @param id
    39. * @return
    40. */
    41. @GetMapping("/evaluate/{id}")
    42. public Result findEva(@PathVariable Integer id) {
    43. Evaluate evaluate = evaluateService.getById(id);
    44. //判断是否为空 为空则断言异常
    45. Assert.notNull(evaluate, "该评价不存在");
    46. return Result.succ(evaluate);
    47. }
    48. /**
    49. *
    50. * @param currentPage
    51. * @param uid
    52. * @return
    53. */
    54. @GetMapping("/findEva")
    55. public Result evaLists(@RequestParam(defaultValue = "1") Integer currentPage,
    56. @RequestParam(defaultValue = "") Integer uid){
    57. if(currentPage == null || currentPage < 1) currentPage = 1;
    58. Page page = new Page(currentPage, 50000);
    59. QueryWrapper queryWrapper = new QueryWrapper();
    60. queryWrapper.eq("uid",uid);
    61. IPage pageData = evaluateService.page(page,queryWrapper.orderByDesc("e_time"));
    62. return Result.succ(pageData);
    63. }
    64. /**
    65. * 评论分页
    66. */
    67. @GetMapping("/evaluateList")
    68. public Result evalueList(@RequestParam(defaultValue = "1") Integer pageNum,
    69. @RequestParam(defaultValue = "5") Integer pageSize,
    70. @RequestParam(defaultValue = "") Integer uid) {
    71. if (pageNum == null || pageNum < 1) pageNum = 1;
    72. Page page = new Page(pageNum, pageSize);
    73. QueryWrapper queryWrapper = new QueryWrapper();
    74. if (uid!=null) {
    75. queryWrapper.like("uid", uid);
    76. }
    77. IPage pageData = evaluateService.page(page, queryWrapper.orderByAsc("e_time"));
    78. return Result.succ(pageData);
    79. }
    80. /**
    81. * 添加评论
    82. * @param evaluate
    83. * @return
    84. */
    85. @RequiresAuthentication
    86. @PostMapping("/evaluate/addEva")
    87. public Result edit(@Validated @RequestBody Evaluate evaluate) {
    88. //一个空对象用于赋值
    89. Evaluate temp = new Evaluate();
    90. if (evaluate.getId() != null) {
    91. temp = evaluateService.getById(evaluate.getId());//将数据库的内容传递给temp
    92. } else {
    93. temp.setUid(ShiroUtil.getProfile().getId());
    94. temp.setUname(ShiroUtil.getProfile().getNickname());
    95. temp.setUImg(ShiroUtil.getProfile().getImg());
    96. temp.setContent(evaluate.getContent());
    97. temp.setETime(evaluate.getETime());
    98. }
    99. BeanUtil.copyProperties(evaluate, temp);
    100. evaluateService.save(temp);
    101. return Result.succ("成功发表评价");
    102. }
    103. /**
    104. * 单个删除
    105. * @param id
    106. * @return
    107. */
    108. @DeleteMapping("/delEva")
    109. public boolean delEvaList(@RequestParam Integer id){
    110. return evaluateService.removeById(id);
    111. }
    112. /**
    113. * 批量删除
    114. * @param ids
    115. * @return
    116. */
    117. @PostMapping("/delEvas")
    118. public boolean delEvaList(@RequestBody(required = false) List ids){
    119. return evaluateService.removeByIds (ids);
    120. }
    121. }

    1. package com.cupk.controller;
    2. import cn.hutool.core.bean.BeanUtil;
    3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    4. import com.baomidou.mybatisplus.core.metadata.IPage;
    5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    6. import com.cupk.common.lang.Result;
    7. import com.cupk.entity.Gear;
    8. import com.cupk.service.GearService;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.validation.annotation.Validated;
    11. import org.springframework.web.bind.annotation.*;
    12. import java.util.List;
    13. /**
    14. * 雪具相关接口
    15. */
    16. @RestController
    17. @RequestMapping("/gear")
    18. public class GearController {
    19. @Autowired
    20. GearService gearService;
    21. /**
    22. * 雪具列表
    23. * @param pageNum
    24. * @param brand
    25. * @param category
    26. * @return
    27. */
    28. @GetMapping("/gears")
    29. public Result gearList(@RequestParam(defaultValue = "1") Integer pageNum,
    30. @RequestParam(defaultValue = "2") Integer pageSize,
    31. @RequestParam(defaultValue = "") String brand,
    32. @RequestParam(defaultValue = "") String category,
    33. @RequestParam(defaultValue = "") String size){
    34. if(pageNum == null || pageNum < 1) pageNum = 1;
    35. Page page = new Page(pageNum, pageSize);
    36. QueryWrapper queryWrapper = new QueryWrapper();
    37. if (!"".equals(brand)){
    38. queryWrapper.like("brand",brand);
    39. }
    40. if (!"".equals(category)){
    41. queryWrapper.like("category",category);
    42. }
    43. if(!"".equals(size)){
    44. queryWrapper.like("size",size);
    45. }
    46. IPage pageData = gearService.page(page,queryWrapper.orderByAsc("brand"));
    47. return Result.succ(pageData);
    48. }
    49. /**
    50. * 编辑雪具信息
    51. * @param gear
    52. * @return
    53. */
    54. @PostMapping("/edit")
    55. public Result edit(@Validated @RequestBody Gear gear) {
    56. //一个空对象用于赋值
    57. Gear temp = null;
    58. //如果有id则是编辑
    59. if (gear.getId() != null) {
    60. temp = gearService.getById(gear.getId());//将数据库的内容传递给temp
    61. } else {
    62. temp = new Gear();
    63. temp.setBrand(gear.getBrand());
    64. temp.setCategory(gear.getCategory());
    65. temp.setDeposit(gear.getDeposit());
    66. temp.setGImg(gear.getGImg());
    67. temp.setSize(gear.getSize());
    68. temp.setStock(gear.getStock());
    69. temp.setRent(gear.getRent()) ;
    70. }
    71. BeanUtil.copyProperties(gear, temp);
    72. gearService.saveOrUpdate(temp);
    73. return Result.succ("修改成功");
    74. }
    75. /**
    76. * 单个删除
    77. * @param id
    78. * @return
    79. */
    80. @DeleteMapping("/delGear")
    81. public boolean delEvaList(@RequestParam Integer id){
    82. return gearService.removeById(id);
    83. }
    84. /**
    85. * 批量删除
    86. * @param ids
    87. * @return
    88. */
    89. @PostMapping ("/delGears")
    90. public boolean delEvaList(@RequestBody(required = false) List ids){
    91. return gearService.removeByIds (ids);
    92. }
    93. }

    五,项目总结

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

  • 相关阅读:
    你的数据库到底应该如何存储密码?
    【21-业务开发-基础业务-商品模块-分类管理-商品系统三级分类的新增类别前后端代码实现-商品系统三级分类的更新类别前后端代码实现-之前错误的Bug修正】
    生态系统NPP及碳源、碳汇模拟实践技术应用
    制作一个模板三
    Gitlab-Runner安装并注册
    excel函数公式
    找不到msvcr110.dll丢失的解决方法-常见修复方法分享
    【高等数学】微分中值定理
    栈的应用:括号匹配,递归
    MySQL统计近12个月的数据,如果某个月份没有数据则用0填充
  • 原文地址:https://blog.csdn.net/BS009/article/details/127457873