智慧停车Park系统V1.0 PDF
Document Details
Uploaded by FashionableSasquatch7277
Tags
Summary
This document describes a smart parking system, V1.0, with detailed function descriptions for both front-end (user) and back-end (administrator) aspects. It covers features such as login, registration, car space management, and user management. The document also outlines technical specifications, design considerations, and implementation details.
Full Transcript
智慧停车Park系统V1.0 1.需求分析 2.功能描述 前台业务: 2.1 首页 :显示当前停车系统banner图,系统公告信息,系统广告 信息 2.2 登录: 系统会员用户登录系统进行验证 利用第三方235平台 进行短信登录 二维码登录 2.3 注册: 会员用户注册成为停车系统普通会员 短信注册 实名第 三方平台注册 2.4 车位查询:浏览系...
智慧停车Park系统V1.0 1.需求分析 2.功能描述 前台业务: 2.1 首页 :显示当前停车系统banner图,系统公告信息,系统广告 信息 2.2 登录: 系统会员用户登录系统进行验证 利用第三方235平台 进行短信登录 二维码登录 2.3 注册: 会员用户注册成为停车系统普通会员 短信注册 实名第 三方平台注册 2.4 车位查询:浏览系统已占用车位和未占用车位的信息,并且利 用第三方百度平台sdk组件显示车位地图信息 2.5 预约车位:对车位进行预约 并且在后台生成车位订单 进行车 位订单结算 2.6 申请成为会员:如果是非会员 需要向系统提交快成为会员审批 申请 2.7 会员中心:个人信息维护 修改密码 订单维护 留言板维护 后台业务: 2.8 公告管理: 对系统公告进行维护 2.9 车位管理: 系统后台对车位信息详情进行录入 包括利用第三 方地图采集器对系统车位进行经度纬度信息录入 3.0 订单管理: 对系统所有订单进行浏览,查询,订单维护 3.1 积分排行: 对系统会员进行积分排行管理统计 3.2 会员审批: 对系统会员用户进行成为会员的审批操作 3.3 留言功能: 对系统所有用户的留言信息进行维护 3.4 管理员维护:对系统管理员进行任命添加 未来会成为地区代理 形势 3.5 用户管理: 对会员进行权限撤销功能 以免会员恶意停车 3.系统背景 为了方便哈尔滨市广大出行用户 在节假日期间 减少商圈地下停车场 的车位压力 实现本系统。可利用信息化以及移动互联网展示停车位 信息,方便商家与交通部门和居民之间三方减少出行压力 停车压力 的一套信息化系统解决方案,本系统一共分为双端 pc端程序 移动 程序(IOS/安卓) ### 4.软件开发环境 操作系统:win8 软件环境:jdk1.8 MySql5.6 开发框架:SpringBoot Spring Mybatis LayUi前端组件 百度地图 第三方SDK 5.原型设计 产品经理利用Axure或 磨刀工具 来对软件初始化界面进行设计 所 谓的原型设计就是软件页面的静态图 所有数据都是静态的(数据是写 死的) 但功能和业务逻辑与开发后的系统无差别 项目启动 1.安装jdk 2.安装IDEA开发工具 3.安装本地MySql客户端程序 安装可视化操作工具Navicat 导入数 据库备份 4.配置maven依赖环境 部署程序 5.启动并运行项目 6.系统开发 6.1 数据库建模 6.2 代码开发 7.模块开发 代码开发阶段 登录模块 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //登录业务 @RequestMapping("/login") public String login(@ModelAttribute("users") Users users, HttpSession session, Model model) { //调用模型层业务对象 来查询数据库是否账号密码正确 Users user=userService.login(users); if(user!=null) { //如果账号密码正确 //判断该是否被停用 if(user.getStauts()==0)//账号可用 { //将用户信息存入session全局作用域中 session.setAttribute("LogUser",user); return "redirect:/index"; } else//账号停用 { model.addAttribute("msg","该用户已被停 用"); } } else { //账号密码不正确 model.addAttribute("msg","用户名或密码错 误"); } return "join"; } 注册模块 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //注册业务 @RequestMapping("/user-save") public String saveUser(@ModelAttribute("users") Users users) { //调用模型层对象 执行注册用户操作 if(userService.addUser(users)) { return "register-ok"; } return "register-error"; } 退出登录模块 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //退出登录 @RequestMapping("/logout") public String logout(HttpSession session) { //1清空session作用域中的登录对象 session.removeAttribute("LogUser"); //2跳转到首页 return "/join"; } 在head2.html页面利用thymeleaf模板标签进行判断来控制上方 登录退出状态的切换 登录 注册 退出登录 个 人中心 跳转个人中心页面 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //跳转个人中心 @RequestMapping("/user-show") public String getUserById(@RequestParam("id") int id,Model model) { //根据当前登录用户的id值 查到当前登录的用户详细信息 Users user= userService.getUserById(id); //将登录用户的信息存到model model.addAttribute("userInfo",user); return "/user-show"; } 在user-show.info页面中 获取到当前用户个人中心信息‘ 修改个人信息 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //修改个人信息 @RequestMapping("/update-user") public String updateUser(@RequestParam("users") Users user,Model model) { //1.根据传入进来的user信息 修改当用户字段信息 userService.updateUser(user); //2.根据当前对象重新查询出修改后的用户信息 Users userinfo=userService.getUserById(user.getId()); //3.将修改后的对象信息传入前台进行更新后的数据显示 model.addAttribute("userinfo",userinfo); return "user-show"; } 修改密码 在后台UserController中创建方法 并绑定映射地址 书写如下函数代 码 //修改密码 @RequestMapping("/updatePwd") public String updatePwd(@RequestParam("id") int id, @RequestParam("oldpassword") String oldpassword, @RequestParam("newpassword") String newpassword, Model model) { //1.根据id查询出原有用户信息 Users userInfo= userService.getUserById(id); //2.用前台输入的老密码 跟查询出数据库用户的密码进行 比对 if(oldpassword.equals(userInfo.getPassword())) { //3.将新密码set到查询出的对象中 userInfo.setPassword(newpassword); if(userService.updateUserPwd(userInfo)) { return "redirect:/user/logout"; } } else { model.addAttribute("usermsg","原始密码 错误请确认后重新输入"); } return "password"; } 查询订单信息 创建一个新的 OrderController并在上方映射 @RequestMapping("/order") 并且引入orderService模型层 并且制定OrderController为@Controller bean工厂对象 帮项目自 动管理 @RequestMapping("/order") @Controller public class OrderController { @Autowired private OrderService orderService; } 在OrderController文件中 showOrder方法 并在上方声明子请求映 射@RequestMapping("/showOrder")编写代码如下 //获取当前用户的所有订单信息 @RequestMapping("/showOrder") public String showOrder(HttpSession session, Model model) { //根据当前登录的用户查到 当前用户所提交的订单 Users user= (Users)session.getAttribute("LogUser"); List orderList = orderService.getByUserId(user.getId()); model.addAttribute("orderList",orderList); return "orderList"; } 结算订单 在OrderController中创建一个方法jiesuanOrder 并在方法上方声 明子请求映射@RequestMapping(“/jiesuan”) 书写代码如下 //订单结算(订单支付) @RequestMapping("/jiesuan") public String balanceOrder(@RequestParam("id") int id) { //1.根据订单编号id查询当前要结算的订单信息 Order order = orderService.getById(id); //2.将改订单信息的状态属性设置成已支付 order.setStatus(1); //3.将已经预定的车位变成未预定 if(orderService.updateOrderStatus(order)) { //根据当前订单中的车位外键查询出会员所预定的车位 信息 Park park=parkService.getById(order.getPark_id()); //将车位状态设置为可用 park.setStatus(0); //更新数据库 parkService.updateCarStatus(park); } return "redirect:/order/showOrder"; } 课堂作业: 实现订单删除业务 在OrderController中创建一个方法deleteOrderById并在方法上方 声明子请求映射@RequestMapping(“/delete”) 书写代码如下 //课堂作业:实现删除订单的函数 @RequestMapping("/delete") public String deleteOrderById(@RequestParam("id") int id) { //根据前台传来的 订单id删除当前选中的订单信息 if( orderService.delOrder(id)) { return "redirect:/order/showOrder"; } return "404" ; } 实现留言板信息 只需要查询出当前用户的留言信息即可 对应数据库表格 message 对应页面 myMessage.html 对应Service业务类 是MessageService 难点: 后台MessageService类中 没有实现根据用户id查询当前用户 留言的接口信息 需要手动添加 //查询用户留言列表信息 @RequestMapping("/myMessage") public String myMessage(@RequestParam("id") int id, Model model ) { //1.查询出 当前登录用户所在系统中的所有留言信息 List messageList = messageService.getMyMessage(id); //2.存入model作用域 model.addAttribute("messageList",messageList); //3.转页 return "myMessage"; } 课堂作业 点击任意一条删除按钮 会删除当前选中的留言信息 实现思路 在message的控制层中 创建一个 映射 RequestMapping("/delMsg")编写方法 在方法中接到前台传来的 删除id主键值 通过主键值删除当前的留言信息 重新从session中获 取到当前用户登录的id值 通过用户id值 查询出当前系统中这个用户 的留言信息 传入model中 再重新带回 message页面! 在MessageController类文件中创建一个delMsg方法 在上方声明子 请求映射@RequestMapping(“/delMsg”) 在方法中书写如下代码 //删除留言板信息 并重新查询当前录入用户的留言板列表 @RequestMapping("/delMsg") public String delMsg(HttpSession session,@RequestParam("id") int id, Model model) { //1.根据前台传来的id 删除 留言板信息 messageService.delMessage(id); //2.从session中获取到当前登录用户的id Users user= (Users) session.getAttribute("LogUser"); List messageList = messageService.getMyMessage(user.getId()); //3.将删除后重新查询出的留言信息列表保存在model作用 域中 model.addAttribute("messageList",messageList); return "myMessage"; } 我要留言 实现思路 当用户在文本域中输入要留言的内容 用户点击留言 会将 新的留言写入到数据库中 并且重新查询出这个用户的所有留言信息 在MessageController类文件中创建一个saveMsg方法 在上方声明 子请求映射@RequestMapping(“/message-save”) 在方法中书写以下代码 //我要留言 @RequestMapping("/message-save") public String saveMsg(HttpSession session,Message message,Model model) { //1.将用户提交的留言保存到数据库中 Users user= (Users) session.getAttribute("LogUser"); message.setUser_id(user.getId()); message.setUser_name(user.getName()); messageService.addMessage(message); //2.在将当前用户的最新留言记录重新在数据中查询出来 List messageList = messageService.getMyMessage(user.getId()); //3.将最新的留言记录保存到model作用域 model.addAttribute("messageList",messageList); //4.跳转页面 return "myMessage"; } 查询车位 创建一个parkController类文件并且指定好@Controller 和 @RequestMapping("/car") @Controller @RequestMapping("/car") public class ParkContoller { } 在parkController类文件中标记好一个getAllPark方法并指定子映射 为@RequestMapping("/car-select") 在方法中书写如下代码 @RequestMapping("/car-select") public String getAllPark() { return null; } 点击下拉查询某地区车位信息 在parkController类文件中标记好一个selectParkByDiqu方法并 指定子映射为@RequestMapping("/findCar") 在方法中书写如下代码 //根据用户下拉选择进行车位查询 @RequestMapping("/findCar") public String selectParkByDiqu(HttpServletRequest request,Model model) { //1.接到前端用户下拉选择的地区id值 String diquId=request.getParameter("diquId"); List diquList = parkService.getDiQuList(); //2.根据用户点击的下拉请求id来判断是展示全部车位还是 当前选择的车位 if("0".equals(diquId))//查询全部车位 { System.out.println("全部"); //1.将全部车位查询出来 List parkList = parkService.getAll(); //2.将两个信息传入Model作用域中带回页面 model.addAttribute("carList",parkList); model.addAttribute("diquList",diquList); } else //查询当前选择的地区车位 { System.out.println("当前地区 id===="+diquId); //1.根据用户下拉选择的地区作为查询条件 查询出当 前选中地区的车位信息 List parkList=parkService.getAllByKey(diquId); //2.将两个信息传入Model作用域中带回页面 model.addAttribute("carList",parkList); model.addAttribute("diquList",diquList); } return "list"; } 点击某个可预定车位查询出车位具体信息并且实现百度地图定位 在parkController类文件中标记好一个queryParkById方法并指 定子映射为@RequestMapping("/detail") 在方法中书写如下代码 //根据车位id查询出车位具体信息 @RequestMapping("/detail") public String queryParkById(@RequestParam("id") int id,Model model) { //1.根据车位id查询出 当前车位信息 Park park=parkService.getById(id); model.addAttribute("car",park); return "detail"; } 在detail页面js中动态获取到隐藏域信息用于百度地图显示 成为会员 如果用户不是会员 不可以预定车位 只能浏 览首页 和查询车位 主页head页面 会出现申请会员按 钮字样 思路:当用户登录成功后 需要从session中获取到当前用户的vip字 段值 存入session中 实现步骤: 1.在前台用户登录业务逻辑中 需要存储当前登录用户的vip状态 2.在list.html页面 和 head2.html页面分别加入 如下代码 3.编写js函数 function becomeVip(obj) { // 禁用点击事件 $("#but").attr("disabled",true); $.ajax({ type: 'POST', url: '/user/become-vip', data:{}, dataType: 'json', success: function(data){ if(data=="1"){ location.href="/user/vipSuccess"; } else if(data=="2") { layer.msg('服务器出现异常请稍后 再试!',{icon:2,time:1000}); } else { layer.msg('请您登录系统后再进行 申请会员哦!',{icon: 2,time:4000}); } } }); } 4.在userControllerl类文件中添加becomeVip方法 并绑定 requestMapping映射为@RequestMapping("become-vip") 编写如下代码 //申请成为会员 @RequestMapping("become-vip") public String becomeVip(HttpSession session) { //1.先从session中获取到当前登录用户的对象信息 Users user= (Users)session.getAttribute("LogUser"); //2.设置一个公共的返回值 String rsCode="0"; if(user!=null) { //获取到当前登录用户的主键id int userId= user.getId(); if(userService.addShenPiList(userId)) { rsCode="1"; } else { rsCode="2"; } } return "0"; } 4.在userControllerl类文件中添加returnSuccess方法 并绑定 requestMapping映射为@RequestMapping("/vipSuccess") 编写如下代码 //跳转申请提交成功vip页面 @RequestMapping("/vipSuccess") public String returnSuccess() { return "vipSuccess"; } 预约车位 并增加积分 生成订单 返回并查看预约账单 列表 //根据用户选择的车位id进行预约 @RequestMapping("/buy") public String buyPark(HttpSession session, @RequestParam("id") int id) { //1.判断当前用户是否登录 springBoot框架已经实现好 权限验证 用户不能登陆无法实现支付业务 Park car=parkService.getById(id); Users user= (Users) session.getAttribute("LogUser"); //2.判断用户是不是会员 是会员才可以预约车位生成订单 if(user.getVipStaut()==1) {//进行订单支付 //1.获取到当前用户的积分 int p=user.getPoint(); //2.将车位信息变成已使用状态 car.setStatus(1); //3.如果当前车位已经预定 if(parkService.updateCarStatus(car)){ //4.生成订单对象 Order order= new Order(); //5.将生成订单的用户保存进对象中 order.setUser_id(user.getId()); //6.将车位外键存入对象中 order.setPark_id(car.getId()); if(p>=100&& p=300&& p=500) { order.setTotal(car.getPrice()*0.7);//7折 }else { order.setTotal(car.getPrice());// 原价 } if(orderService.addOrder(order)) { //用户积分+10 user.setPoint(p+10); //更新用户积分数据 userService.updatePoint(user); } return "redirect:/order/showOrder"; } } return "notVip"; } 公告详情 在后台创建 NoticeController类文件并指定@controller和 @RequestMapping("/notice") 在类文件中编写方法showNotice 并指定子集映射 @RequestMapping("/notice-detail") 编写代码如下 //跳转指定公告详情页 @RequestMapping("/notice-detail") public String showNotice(@RequestParam("id") int id, Model model) { //1.根据前台传来的公告id获取当前点击公告的详情信息 Notice notice=noticeService.getById(id); //2.将查询出的公告对象保存至model作用域中 model.addAttribute("notice",notice); //3.转页 return "notice-detail"; }