JavaSSM框架学完,手写一个汽车租赁系统,真NE!

news/2024/9/16 18:35:46/

文章目录

  • 适合人群
  • 项目介绍
  • 项目整体功能图
  • 涉及的技术
  • 数据库设计
    • 一.业务表
      • 1,客户表(bus_customers)
      • 2,车辆表(bus_cars)
      • 3,出租表(bus_rents)
      • 4,还车表(bus_checks)
    • 二,系统表(RBAC权限管理)
      • 1.菜单表(sys_menus)
      • 2. 用户表(sys_users)
      • 3.角色表(sys_roles)
      • 4. 角色和菜单关系表(sys_role_menu)
      • 5.用户和角色和关系表(sys_role_user)
    • 二,系统表(其它)
      • 1.登陆日志表(sys_log_login)
      • 2. 系统公告表(sys_news)
  • 环境的搭建
    • 目录结构结合项目介绍

适合人群

学完了SSM框架的相关知识,但是总感觉自己对于框架的使用和理解并不是很深刻,所以决定写一个项目来练习和提升自己对于框架的理解以及使用框架进行开发过程的理解

适合人群:

  1. 熟悉SSM框架,熟悉SSM框架开发流程
  2. 了解LayUI框架的基本知识
  3. 熟悉jQuery,jsp等技术

通过练习该项目,能够提升对于SSM框架的理解,了解项目的基本开发流程以及前后端数据的交互.

项目介绍

先看一下项目演示:

在这里插入图片描述

项目整体功能图

在这里插入图片描述

该项目是一个汽车租赁项目,登录成功后,能实现租车时的汽车出库和汽车入库,有客户管理,车辆管理,出租单管理,检查单管理等业务功能.也有客户管理,角色分配等系统功能,同时能实现对于客户,车辆,业绩的简单数据分析.

涉及的技术

  • Spring,SpirngMVC,MyBatis框架(SSM)
  • 前端LayUI框架,jsp,jQuery等技术
  • Quartz定时任务框架
  • log4j日志系统,druid数据源监控
  • echarts为数据分析提供技术支持
  • maven的使用
  • 简单的RBAC角色分配技术

数据库设计

一.业务表

1,客户表(bus_customers)

字段名字段说明类型是否主键备注
identity身份证varhcar
custname姓名Varchar
sex性别Int
address地址varchar
phone电话varchar
career职位varchar

2,车辆表(bus_cars)

字段名字段说明类型是否主键备注
carnumber车牌号varhcar
cartype类型varchar
color颜色varchar
price购买价格double
rentprice出租价格double
deposit押金double
isrenting是否出租int
description描述varchar
carimg车辆图片varchar

3,出租表(bus_rents)

字段名字段说明类型是否主键备注
rentid出租单号varhcar后台使用时间生成
price出租实际价格double
begindate开始时间Datetime
returndate还车时间Datetime
rentflag出租状态int0未归还1已归还
identity客户身份证varchar
carnumber车牌号varchar
opername操作员varchar当前登陆人

4,还车表(bus_checks)

字段名字段说明类型是否主键备注
checkid检查单号varhcar后台使用时间生成
checkdate检查时间datetime
checkdesc描述varchar
problem存在问题varchar
paymoney赔付金额double
opername操作员varchar当前登陆人
rentid出租单号varchar

二,系统表(RBAC权限管理)

1.菜单表(sys_menus)

字段名字段说明类型是否主键备注
idIDInt
pid父节点idInt
name菜单名称varchar
href跳转地址varchar
open是否打开Int0不打1打开
parent是否父节点Int0非父节点1父节点
target打开方式varchar
icon节点图标varchar
tabiconTab图标varcharimg
available是否可用Int0不可用1可用

2. 用户表(sys_users)

字段名字段说明类型是否主键备注
userid用户编号Int
loginname登陆名varchar
identity身份证号varchar
realname真实名称varchar
sex性别Int0女1男
address地址varchar
phone电话varchar
pwd密码varchar
position职位varchar
type用户类型Int1,超级管理员2,系统用户Where type<>1

3.角色表(sys_roles)

字段名字段说明类型是否主键备注
roleid角色编号Int
rolename角色名称varchar
roledesc角色备注varchar

4. 角色和菜单关系表(sys_role_menu)

字段名字段说明类型是否主键备注
rid角色编号Int角色表的roleid外键
mid菜单编号Int菜单表的id外键

5.用户和角色和关系表(sys_role_user)

字段名字段说明类型是否主键备注
uid用户编号Int用户表的userid外键
rid角色编号Int角色表的roleid外键

二,系统表(其它)

1.登陆日志表(sys_log_login)

字段名字段说明类型是否主键备注
id日志IDInt
loginname登陆名+真实姓名varchar
loginip登陆IPvarchar
logintime登陆时间datetime

2. 系统公告表(sys_news)

字段名字段说明类型是否主键备注
id编号Int
title标题varchar
Content内容varchar
createtime发布时间datetime
opername发布人varchar

环境的搭建

  • 我使用的是IDEA的开发工具

个人感觉IDEA开发工具对于程序员比较友好,熟练的使用能够提高开发的效率

创建maven项目导入相关依赖的jar包创建对应的包

这部分比较基础,都是一些配置相关,详细的配置方法在我之前的博客文章中都有介绍,这里不赘述.

目录结构结合项目介绍

这里给出创建好的目录结构

image-20200714155711472

  • 将项目的包分为三个:分别是bus对应业务相关的包,sys对应系统功能相关,task对应数据分析相关.

合理的分包,程序不仅可读性强,开发也更高效

配置好开发环境:

  1. 创建项目

  2. 导入依赖

  3. 创建druid.properties

  4. 创建log4j.properties

  5. 创建spring-dao.xml

  6. 创建spring-service.xml

  7. 创建spring-context.xml

  8. 创建spring-mvc.xml

  9. 修改web.xml

  10. 创建file.properties

    文件上传下载的配置文件

    #file upload path config
    path=G:/upload/
    
  11. 创建AppListener

    过滤器

    package per.leiyu.sys.listener;import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;@WebListener
    public class AppListener implements ServletContextListener{@Overridepublic void contextDestroyed(ServletContextEvent arg0) {}@Overridepublic void contextInitialized(ServletContextEvent arg0) {//取到ServletContextServletContext context=arg0.getServletContext();context.setAttribute("leiyujia", context.getContextPath());System.err.println("---------Servlet容器创建成功 leiyujia被放到ServletContext作用域-------");}}
  12. 创建RandomUtils

    产生随机数的工具类

    package per.leiyu.sys.utils;import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Random;
    import java.util.UUID;/*** 随机工具类* @author leiyu*/
    public class RandomUtils {private static SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");private static SimpleDateFormat sdf2=new SimpleDateFormat("yyyyMMddHHmmssSSS");private static SimpleDateFormat sdf3=new SimpleDateFormat("yyyyMMdd_HHmmss_SSS");private static Random random=new Random();/*** 得到当前日期*/public static String getCurrentDateForString() {return sdf1.format(new Date());}/*** 生成文件名使用时间+4位随机数* @param fileName 文件名称*/public static String createFileNameUseTime(String fileName) {String fileSuffix=fileName.substring(fileName.lastIndexOf("."),fileName.length());String time=sdf2.format(new Date());Integer num=random.nextInt(9000)+1000;return time+num+fileSuffix;}/*** 生成文件名使用时间+4位随机数* @param fileName 文件名称* @param suffix  临时文件的后缀*/public static String createFileNameUseTime(String fileName,String suffix) {String fileSuffix=fileName.substring(fileName.lastIndexOf("."),fileName.length());String time=sdf2.format(new Date());Integer num=random.nextInt(9000)+1000;return time+num+fileSuffix+suffix;}/*** 生成文件名使用UUID* @param fileName 文件名称*/public static String createFileNameUseUUID(String fileName) {String fileSuffix=fileName.substring(fileName.lastIndexOf("."),fileName.length());return UUID.randomUUID().toString().replace("-", "").toUpperCase()+fileSuffix;}/*** 根据时间+五位随机数生成字符串* @param preffx* @return*/public static String createRandomStringUseTime(String preffx) {return preffx+"_"+sdf3.format(new Date())+"_"+(random.nextInt(90000)+10000);}
    }
  13. 创建WebUtils

    Web的工具类:

    1. 得到当前线程的请求对象
    2. 得到当前线程的响应对象
    3. 得到session对象
    4. 得到servletContext对象
    package per.leiyu.sys.utils;import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;/*** web的工具类* @author leiyu*/
    public class WebUtils {public static ServletRequestAttributes getServletRequestAttributes() {return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();}/*** 得到当前线程的请求对象* @return*/public static HttpServletRequest getHttpServletRequest() {return getServletRequestAttributes().getRequest();}/*** 得到当前线程的响应对象*/public static HttpServletResponse getHttpServletResponse() {return getServletRequestAttributes().getResponse();}/*** 得到session对象*/public static HttpSession getHttpSession() {return getHttpServletRequest().getSession();}/*** 得到servletContext对象*/public static String getServletContext() {return getHttpServletRequest().getServletPath();}
    }
  14. 创建AppFileUtils

    文件上传下载的工具类

    package per.leiyu.sys.utils;import org.apache.commons.io.FileUtils;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    import java.util.Properties;/*** 文件上传工具类* @author leiyu*/
    public class AppFileUtils {/*** 得到文件上传的路径*/public static String PATH="G:/upload/";static {InputStream stream = AppFileUtils.class.getClassLoader().getResourceAsStream("file.properties");Properties properties=new Properties();try {properties.load(stream);PATH=properties.getProperty("path");} catch (IOException e) {e.printStackTrace();}}/*** 文件下载* @param response* @param path* @param oldName* @return*/public static  ResponseEntity<Object> downloadFile(HttpServletResponse response, String path, String oldName) {//4.使用绝对路径+相对路径去找到文件对象File file=new File(AppFileUtils.PATH,path);//5.判断文件是否存在if(file.exists()) {try {try {//如果名字有中文 要处理编码oldName=URLEncoder.encode(oldName,"UTF-8");} catch (Exception e) {e.printStackTrace();}//把file转成一个bytesbyte[] bytes=FileUtils.readFileToByteArray(file);HttpHeaders header=new HttpHeaders();//封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)header.setContentType(MediaType.APPLICATION_OCTET_STREAM);//设置下载的文件的名称header.setContentDispositionFormData("attachment",oldName);//创建ResponseEntity对象ResponseEntity<Object> entity = new ResponseEntity<Object>(bytes,header,HttpStatus.CREATED);return entity;} catch (Exception e) {e.printStackTrace();}return null;}else {PrintWriter out;try {out = response.getWriter();out.write("文件不存在");out.flush();out.close();} catch (IOException e) {e.printStackTrace();}return null;}}/*** 根据相对路径删除硬盘上文件* @param path*/public static void deleteFileUsePath(String path) {String realPath=PATH+path;//根据文件File file=new File(realPath);if(file.exists()) {file.delete();}}/*** 更改文件名* @param carimg* @param suffix*/public static String updateFileName(String carimg,String suffix) {//找到文件try{File file = new File(PATH,carimg);if (file.exists()){file.renameTo(new File(PATH,carimg.replace(suffix,"")));return carimg.replace(suffix,"");}}catch (Exception e){e.printStackTrace();}return null;}/*** 根据路径删除图片* @param carimg*/public static void removeFileByPath(String carimg) {//找到文件try{File file = new File(PATH,carimg);if (file.exists()){file.delete();}}catch (Exception e){e.printStackTrace();}}
    }

这篇博客主要是数据库环境和java开发环境的搭建

下一篇博客开始详细开发流程的详细介绍.

你问为什么不把开发流程和项目环境搭建放在一起?

54918411_1502106113102

先理解SSM最基础的技术(当时我环境搭建也是搞了很久才搞明白(尤其是maven的依赖),可能是因为笨吧)

我是雷雨,一个普本科的学生,主要专注于Java后端和大数据开发

如果这篇文章有帮助到你,希望你给我一个大大的赞
如果有什么问题,希望你能留言和我一起研究,学习靠自觉,分享靠自愿

转载注明出处
https://blog.csdn.net/qq_40742223

PATH,carimg);
if (file.exists()){
file.delete();
}
}catch (Exception e){
e.printStackTrace();
}
}
}

```

不知不觉1w多字了,这篇博客主要是数据库环境和java开发环境的搭建.

下一篇博客开始详细开发流程的详细介绍.

你问为什么不把开发流程和项目环境搭建放在一起?
在这里插入图片描述
先理解SSM最基础的技术(当时我环境搭建也是搞了很久才搞明白(尤其是maven的依赖),可能是因为笨吧)

我是雷雨,一个普本科的学生,主要专注于Java后端和大数据开发

如果这篇文章有帮助到你,希望你给我一个的赞
如果有什么问题,希望你能评论区和我一起研究.

如果您要转载请转载注明出处
https://blog.csdn.net/qq_40742223


http://www.ppmy.cn/news/554973.html

相关文章

CSS基础学习--26 渐变(Gradients)

CSS3 渐变&#xff08;gradients&#xff09;可以让你在两个或多个指定的颜色之间显示平稳的过渡。以前&#xff0c;你必须使用图像来实现这些效果。但是&#xff0c;通过使用 CSS3 渐变&#xff08;gradients&#xff09;&#xff0c;你可以减少下载的时间和宽带的使用。此外&…

工作能力强的人有哪些共同特征?

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 本文整理自知乎问答&#xff0c;仅用于学术分享&#xff0c;著作权归作者所有。如有侵权&#xff0c;请联系后台作删文处理。 观点一 作者&#xff5c;马力和知群 https://www.zhihu.com/question/28880482/a…

推荐!最适合初学者的18个经典开源计算机视觉项目

英语原文&#xff1a;18 All-Time Classic Open Source Computer Vision Projects for Beginners 翻译&#xff1a;雷锋字幕组&#xff08;小哲&#xff09; 概述 开源计算机视觉项目是在深度学习领域中获得一席之地的绝佳路径 开始学习这18个非常受欢迎的经典开源计算机视觉…

社交效率管理,你get了么?——做一款基于日程的联系人管理工具

目录 一、遇到的问题 &#xff08;一&#xff09;、突飞猛进的联系人数量和管理跟不上之间的矛盾问题 &#xff08;二&#xff09;、联系人多重身份的问题 &#xff08;三&#xff09;、趋势分析的问题 二、寻求改变 &#xff08;一&#xff09;、联系人管理的起点&#…

博士年薪22-40万,重点大学博士给100㎡产权房,安家费30-40万,省会城市高校 | 留言送书...

来源 | 高校人才网V 编辑 | 论文项目硕博招聘 一、学校简介 郑州工业应用技术学院位于中国历史文化古都河南省新郑市&#xff0c;是经教育部批准、中原华信商贸集团有限公司投资举办的一所全日制普通民办本科院校。 历史沿革学校创建于1997年&#xff0c;2008年升格为本科高校&…

泪目!兰大硕导的《致谢》火了:我从来不曾优秀过,也从来不曾放弃过!

本文来源&#xff1a;《国科大》2019年第3期 作者&#xff1a;赵序茅老师、澎湃新闻&#xff08;岳怀让&#xff09; 编辑&#xff1a;募格学术 考研刚结束没多久&#xff0c;这几天&#xff0c;兰州大学硕导赵序茅刊登在《国科大》2019年第3期的一篇文章《毕业致谢&#xff1a…

女研究生做“思维导图”与男友吵架!网友:吵架届的“内卷之王”....

本文募格学术撰写。参考资料&#xff1a;抖音、女教授跟生活的死磕、极目新闻&#xff08;记者&#xff1a;丁伟&#xff09; 、亚辉、麦穗视频、潇湘晨报、知乎、微博等。 研究生吵起架来的“职业病”有哪些&#xff1f; 近日&#xff0c;湖南长沙一女研究生因为“画思维导图与…

IRS应用发布之十五:应用安全自测指南

安全要求 系统使用所有第三方组件必须为最新无已知公开漏洞版本。 上架应用必须配置并使用SSL协议, 并且代码和提供的服务中也都使用https协议。 上架应用必须使用浙里办账号体系,使用提供的浙里办免登接口获取用户身份信息,禁止自建登陆体系。 上架应用所有接口都需要结合有…

要么到岗,要么离职!马斯克:特斯拉「远程办公」到此结束

作者丨David 来源丨新智元 【导读】马斯克连发两封邮件&#xff0c;特斯拉「远程办公」宣布结束&#xff0c;全员每周必须办公室到岗至少40小时&#xff0c;不愿意来的可以走人。 疫情汹涌&#xff0c;「居家办公」早已成为热词。 无论企业大小&#xff0c;员工老幼&#xff0c…

DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!

作者丨Aeneas 拉燕 来源丨新智元 【导读】在网上&#xff0c;不断冒出的Deepfake视频让人们难辨真假。Tiktok上的假汤姆克鲁斯已经拥有了360万粉丝。Deepfake的门槛变低&#xff0c;也带来了源源不断的问题…… 在世界上最受欢迎的社交媒体平台之一TikTok上&#xff0c;源源不断…

Android开发框架大全-AndroidFrames

github地址 &#xff1a;https://github.com/linhaosheng/AndroidFrames AndroidFrames是一个集合了一些在日常开发是使用到的开源框架&#xff0c;包括网络请求&#xff0c;Gson解析&#xff0c;Glide图片加载&#xff0c;适配器&#xff0c;对话框&#xff0c;权限检查&…

打车软件系统分析与设计方案

摘要 本文是笔者软件工程与方法课的课程作业&#xff0c;从中国网约车行业的发展历程及市场现状出发&#xff0c;立足于当下市场需求&#xff0c;以期设计一款具有市场竞争力的打车软件。本文首先对打车软件进行需求分析&#xff0c;然后采用SA方法及DFD描述工具进行系统…

通过车牌号查车辆信息的方法有哪些?

牌照也叫车牌&#xff0c;是指车辆号牌&#xff0c;根据车牌号可以查到车主电话&#xff0c;可查到车辆的主人姓名以及车辆的登记信息。 通过车牌号还可以查到的信息包括行驶证上的发动机号&#xff0c;车架号和初次登记日期以及车辆的年检日期&#xff0c;出厂日期和使用性质…

基于树莓派车牌识别门禁系统

基于树莓派车牌识别门禁系统 前言开发环境源码硬件效果演示后记 前言 毕业设计想做一个集大学所自学过的所有语言&#xff0c;再加上嵌入式的完整应用类型。但由于疫情的原因&#xff0c;没办法完整的展现。不过中间还是自己一系列将前端、后端、前后端交互、数据库以及Androi…

用Python拨打电话

用python拨打电话&#xff0c;先看小视频 Python自动化技术广泛应用于测试、运维相关领域&#xff0c;我自己现在也是做的这方面&#xff0c;工资也不比其他方向少&#xff0c;就业相对容易的多&#xff0c;而且需求的公司也多&#xff0c;对后端框架之类也要求不是很高&#x…

java——反射与注解

文章目录 Java反射基础1. 概念详解2. 示例代码 Java反射进阶1. 框架设计2. 动态代理3. 模板方法 Java注解基础1. 概念2. 基本语法3. 自定义注解4. 反射获取注解信息 Java注解进阶1. 应用场景2. 内置注解3. 第三方注解库4. 总结 Java反射与注解实战1. 实战场景2. 代码实现 Java反…

【Java 基础篇】Java 修饰符:掌握代码的灵魂之钥

文章目录 导言一、访问修饰符二、非访问修饰符1、final修饰符2、static修饰符3、abstract修饰符4、synchronized修饰符 三、修饰符的组合使用总结 导言 在Java编程中&#xff0c;修饰符是一种关键元素&#xff0c;用于控制类、方法、变量和构造函数的访问性、行为和特性。Java…

深入地下,实地探访!不用人挖煤的智能煤矿长什么样?

来源&#xff1a;脑极体 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱&…

煤泥水处理方法

1.一种煤泥水处理方法&#xff0c;其特征在于&#xff1a;包括以下步骤&#xff1a; (1)、将煤炭洗选后的煤泥水通过管道输送到洗煤厂内的底流浓缩池&#xff0c;向底流浓缩池内加入絮凝剂将煤泥水浓缩&#xff0c;使得煤泥水中的含固量达到300&#xff5e;400g/L; (2)、将浓缩…

浅谈智慧矿山之智慧矿山建设的目的

自从王国法院士向国家提出智慧矿山建设的时间规划之后&#xff0c;在煤矿系统的圈子里&#xff0c;大家交流最多的就是智能化、智慧化&#xff0c;谁都可以讲几句&#xff0c;说点东西出来。但是我们为什么要建设智慧矿山呢&#xff1f;很多人也在问&#xff0c;很多回答都是见…