使用SSM和layui做了一个汽车租赁后台管理系统,功能还没有完善,先发出来再慢慢完善更新

包结构:

项目后期又用Maven整合了一下,jar包太多,把pom贴出来好了
pom.xml

<properties><aspectjweaver.version>1.9.4</aspectjweaver.version><classmate.version>1.3.4</classmate.version><commons-fileupload.version>1.3.1</commons-fileupload.version><commons-lang3.version>3.9</commons-lang3.version><commons-logging.version>1.2</commons-logging.version><druid.version>1.0.28</druid.version><fastjson.version>1.2.62</fastjson.version><hibernate-validator.version>5.1.1.Final</hibernate-validator.version><hutool-all.version>4.6.10</hutool-all.version><jackson-annotations.version>2.9.9</jackson-annotations.version><jackson-core.version>2.9.9</jackson-core.version><jackson-databind.version>2.9.9</jackson-databind.version><jsqlparser.version>1.3</jsqlparser.version><jstl.version>1.2</jstl.version><log4j.version>1.2.17</log4j.version><mybatis.version>3.5.0</mybatis.version><mybatis-spring.version>1.3.3</mybatis-spring.version><mysql-connector-java.version>5.1.47</mysql-connector-java.version><pagehelper.version>5.1.8</pagehelper.version><spring.version>5.2.0.RELEASE</spring.version><standard.version>1.1.2</standard.version><javax.servlet-api.version>3.1.0</javax.servlet-api.version><jsp-api.version>2.2</jsp-api.version></properties><dependencies><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml/classmate --><dependency><groupId>com.fasterxml</groupId><artifactId>classmate</artifactId><version>${classmate.version}</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>${commons-fileupload.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>${commons-logging.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool-all.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson-annotations.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson-core.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-databind.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser --><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>${jsqlparser.version}</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector-java.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>${pagehelper.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-oxm --><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/taglibs/standard --><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>${standard.version}</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${javax.servlet-api.version}</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>${jsp-api.version}</version><scope>provided</scope></dependency></dependencies>

抽取出了使用较多的增删改查方法,封装了一套base公共类

其中,BaseForm和BaseQuery都负责接收前端ajax请求传过来的参数,不同的是,前端的添加、修改操作,用Form接收,查询操作用Query接收。BaseVO作为mybatis的返回类型。所有表的Form,Query,VO,都继承自他们,方便面向父类编程

细节如下:


public class BaseForm {}

查询操作涉及到分页查询,由于使用的是layui框架,所以把layui中分页的两个参数封装了一下

public class BaseQuery {/***     页码 */private Integer page;/***  每页数据条数*/private Integer limit;public Integer getPage() {return page;}public void setPage(Integer page) {this.page = page;}public Integer getLimit() {return limit;}public void setLimit(Integer limit) {this.limit = limit;}
 public class BaseVO {}

BaseMapper

public interface BaseMapper<F,V> {/*** 添加* @param form* @return*/int insert(F form);/*** 根据id删除* @param id* @return*/int delete(@Param("id") Integer id);/*** 根据id查询单个* @param id* @return*/V selectOne(@Param("id") Integer id);/*** 查询全部* @param query* @return*/List<V> selectList(BaseQuery query);/*** 更新* @param form* @return*/int update(F form);}

IBaseService

public interface IBaseService<F,V> {Result add(F form);Result delete(Integer id);Result queryOne(Integer id);Result queryList(BaseQuery query);Result queryPage(BaseQuery query);Result modify(F  form);}

BaseServiceImpl

public class BaseServiceImpl<F, V> implements IBaseService<F, V> {BaseMapper<F, V> baseMapper;public BaseServiceImpl(BaseMapper<F, V> baseMapper) {this.baseMapper = baseMapper;}@Overridepublic Result add(F form) {int row = baseMapper.insert(form);if(row>0) {return new Result();}return new Result(CodeMsg.SYS_ADD_ERROR);}@Overridepublic Result delete(Integer id) {// TODO Auto-generated method stubreturn null;}@Overridepublic Result queryOne(Integer id) {// TODO Auto-generated method stubreturn null;}@Overridepublic Result queryList(BaseQuery query) {List<V> list = baseMapper.selectList(query);if(null == list) {return new Result(CodeMsg.SYS_QUERY_ERROR);}return new Result(list);}@Overridepublic Result queryPage(BaseQuery query) {Page<Object> page = PageHelper.startPage(query.getPage(), query.getLimit());baseMapper.selectList(query);PageInfo pageInfo = new PageInfo();pageInfo.setCount(page.getTotal());pageInfo.setLimit(page.getPageSize());pageInfo.setPage(page.getPageNum());pageInfo.setData(page.getResult());return new Result(pageInfo);}@Overridepublic Result modify(F form) {int row = baseMapper.update(form);if(row > 0){return new Result();}return new Result(CodeMsg.SYS_UPDATE_ERROR);}}

上面的类就是我封装的最主要的一部分公共类,还有一些其他的,贴在下面

CodeMsg枚举类,前端请求处理完成之后,和数据一起返回给前端,方便前端提示

public enum CodeMsg {SUCCESS(200,"OK"),ERROR(2002001,"下雨了,程序员正在路上"),SYS_QUERY_ERROR(4001001,"查询失败"),SYS_ADD_ERROR(4002002,"添加失败"),SYS_DELETE_ERROR(4002003,"删除失败"),SYS_UPDATE_ERROR(4002004,"修改失败"),SYS_USER_VERIF_CODE_ERROR(4002001,"验证码错误,请重新输入"),SYS_USER_LOGIN_NAME_EMPTY_ERROR(4002002,"用户名不能为空"),SYS_USER_LOGIN_PASSWORD_EMPTY_ERROR(4002003,"用户密码不能为空"),SYS_USER_LOGIN_ERROR(4002004,"用户密码不正确"),SYS_USER_ADD_ERROR(4002005,"添加用户失败"),SYS_USER_DELETE_ERROR(4002006,"删除用户失败"),SYS_USER_RESET_PASSWORD_ERROR(4002007,"重置密码失败"), BUSI_RENT_IDCARD_ERROR(4002008,"用户身份证不存在"),/** 车辆管理*/BUSI_CAR_NUM_EXIST_ERROR(4003001,"车牌号已存在"),BUSI_CAR_IMG_SAVE_ERROR(4003002,"汽车图片保存失败"), BUSI_RENT_CARNUM_ERROR(4003003,"车牌号错误"), BUSI_CAR_RENTED_ERROR(4003004,"车辆出租状态异常"), BUSI_CAR_RENT_ERROR(4003005,"修改出租状态失败"),/*** 租车*/BUSI_CAR_RENT_TIME_ERROR(4004001,"租车、还车时间异常"),BUSI_RENT_RENTNO_ERROR(4004002,"出租单号异常"),BUSI_RENT_FLAG_RETURNED_ERROR(4004003,"该订单状态为已归还"),/*** 检查*/BUSI_INSERT_CHECK_ERROR(4005001,"生成检查记录失败"),//菜单模块SYS_MENU_PARENTID_ERROR(4007001,"父菜单不存在"),//角色模块SYS_ROLE_NOT_EXIST_ERROR(4008001,"角色不存在");public Integer code;public String msg;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}private CodeMsg(Integer code, String msg) {this.code = code;this.msg = msg;}
}

Constant常量类,封装了一些常用的字符、数字

public class Constant {/***  业务正常响应码*/public static final String CODE = "200";/*** 参数校验错误编码*/public static final Integer PARAM_CHECK_FAILD_CODE = 4001000;/***   业务正常消息*/public static final String MESSAGE = "SUCCESS";/***      作用域中当前用户key*/public static final String CURRENT_USER = "user";/***   存储在 ServletContexty 作用域中 key web   URL根路径*/public static final String WEB_URL = "cxt";/***   存储在Session中验证码的key*/public static final String VERIFI_CODE = "verifiCode";/*** 默认密码*/public static final String DEFAULT_PASSWORD = "123456";/*** 超级管理员*/public static final Integer SYS_USER_TYPE_ADMIN = 1;/*** 系统用户*/public static final Integer SYS_USER_TYPE_NOMAL = 2;/*** 时间格式*/public static final String Y_M_D_H_M_S = "yyyy-MM-dd HH:mm:ss";/*** 时间格式:yyyyMMddHHmmssSS*/public static final String YMDHMSSS = "yyyyMMddHHmmssSS";/*** 文件存储的目录*/public static final String FILE_FOLDER = "resources/carImg";/*** 未出租*/public static final Integer CAR_NOT_RENT = 1;/*** 车辆已出租*/public static final Integer CAR_RENTED = 2;/*** 车辆未归还*/public static final Integer CAR_NOT_RETURN = 1;/*** 车辆已归还*/public static final Integer CAR_RETURNED = 2;/*** 出租单号前缀*/public static final String CAR_RENT_PRE = "RENT";/*** 检查单号前缀*/public static final String CAR_CHECK_PRE = "CHECK";}

PageInfo类,如果需要分页查询,就把这个类作为数据,封装到Result中,返回给前端

public class PageInfo {private Integer  page;//页码private Integer limit;//每页数据条数private long count;// 总条数private List<Object> data;// 具体的数据public PageInfo() {}public PageInfo( Integer count, List<Object> list) {this.count = count;this.data = list;}public PageInfo(Integer page, Integer limit, long count, List<Object> list) {super();this.page = page;this.limit = limit;this.count = count;this.data = list;}public Integer getPage() {return page;}public void setPage(Integer page) {this.page = page;}public Integer getLimit() {return limit;}public void setLimit(Integer limit) {this.limit = limit;}public long getCount() {return count;}public void setCount(long count) {this.count = count;}public List<Object> getData() {return data;}public void setData(List<Object> data) {this.data = data;}}

Result类,这个类是最终以json格式返回给前端的,里面封装了前端需要的code(状态码) msg(提示信息) data(数据)

public class Result {Integer code;String msg;Object data;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}/***   操作成功,没有返回数据*/public Result() {this.code = CodeMsg.SUCCESS.code;this.msg = CodeMsg.SUCCESS.msg;}/***     操作失败* @param codeMsg*/public Result(CodeMsg codeMsg) {this.msg = codeMsg.getMsg();this.code = codeMsg.getCode();}/***   操作成功,有数据返回* @param data*/public Result(Object data) {this.data = data;this.code = CodeMsg.SUCCESS.code;this.msg = CodeMsg.SUCCESS.msg;}public Result(String msg,Integer code) {this.msg = msg;this.code = code;}}

PageController类,用于跳转页面,我的jsp是放在WEB-INF下的,需要controller帮助跳转

@Controller
@RequestMapping("/page")
public class PageController {/***    用户列表* @return*/@RequestMapping("userList.do")public String userList() {return "sys/user/list.jsp";}@RequestMapping("carList.do")public String carList() {return "busi/car/list.jsp";}@RequestMapping("custList.do")public String custList() {return "busi/customer/custList.jsp";}@RequestMapping("rentList.do")public String rentList() {return "busi/rent/rentList.jsp";}@RequestMapping("checkList.do")public String checkList() {return "busi/check/checkList.jsp";}@RequestMapping("menuList.do")public String menuList() {return "sys/menu/menuList.jsp";}}

VerifiCodeController类,验证码生成类,我用的hutool的工具类,login页面加载时就会请求到这个类

@Controller
@RequestMapping("/verifi")
public class VerifiCodeController {@RequestMapping("/code.do")public void code(HttpServletResponse resp) {//创建验证码LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 1);String code = captcha.getCode();WebUtil.setCurrentVerifiCode(code);try {captcha.write(resp.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

BusiException自定义异常类,用于处理业务逻辑中产生的异常

public class BusiException  extends RuntimeException{private static final long serialVersionUID = -4331357754088686184L;/***  自定义的异常编码*/private Integer code;/***  自定义的异常信息*/private String msg;public BusiException(Integer code, String msg) {this.code = code;this.msg = msg;}/*** @Title:BusiException* @Description:   使用声明的异常信息* @param codeMsg*/public BusiException(CodeMsg codeMsg) {this.code = codeMsg.code;this.msg = codeMsg.msg;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}

GlobalExceptionHandler 全局异常处理类,程序产生的所有一场都会经过这个类的处理,然后返回相应的消息给前端页面

@ControllerAdvice
public class GlobalExceptionHandler  {@ExceptionHandler(value = Exception.class)@ResponseBodypublic Result busiExceptionHandler(HttpServletRequest req,Exception exception) {if (exception instanceof BusiException) {System.out.println("全局异常处理......");BusiException busiException = (BusiException) exception;System.out.println(busiException.getMessage());return new Result(busiException.getMsg(),busiException.getCode());}exception.printStackTrace();return new Result(CodeMsg.ERROR);}}

ApplicationListener 监听器,在程序启动时,加载我的url路径,放到context作用域中,前端用el表达式获取,作为前端页面静态资源的前缀

@WebListener
public class ApplicationListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent sce) {}@Overridepublic void contextInitialized(ServletContextEvent sce) {//获取 contextServletContext context = sce.getServletContext();context.setAttribute(Constant.WEB_URL, PropertiesUtil.getProperty("WEB_URL", "web"));}}

PropertiesUtil 工具类,用于读取properties配置文件

public class PropertiesUtil {private  PropertiesUtil() {}public static String getProperty(String key,String properties) {InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properties+".properties");Properties prop = new Properties();try {prop.load(in);} catch (IOException e) {e.printStackTrace();}return prop.getProperty(key);}}

WebUtil 工具类 封装了一些web相关的常用方法

public class WebUtil {private WebUtil() {}/***   获取当前HttpServletRequest*/public static HttpServletRequest getRequest() {ServletRequestAttributes req =   (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();return req.getRequest();}/***   获取当前HttpSession*/public static HttpSession getSession() {return getRequest().getSession();}/*** 获取当前ServletContext */public static ServletContext getServletContext() {return ContextLoader.getCurrentWebApplicationContext().getServletContext();}/*** 获取当前产生的验证码*/public static  String getCurrentVerifiCode() {Object obj = getSession().getAttribute(Constant.VERIFI_CODE);return obj != null?obj.toString():null;}/***   将验证码放入session*/public static  void setCurrentVerifiCode(String verifiCode) {getSession().setAttribute(Constant.VERIFI_CODE,verifiCode);}/*** 将登陆用户放入Session*/public static  <T>   void setCurrentUser(T t) {getSession().setAttribute(Constant.CURRENT_USER, t);}/*** 获取当前登陆用户*/@SuppressWarnings("unchecked")public static  <T>   T getCurrentUser() {Object obj = getSession().getAttribute(Constant.CURRENT_USER);return obj != null?(T)obj:null;}

ValidatorUtil 数据校验工具类,用于执行新增、修改操作时,判断传入的数据是否合法

public class ValidatorUtil {private static Validator validator;static {validator = Validation.buildDefaultValidatorFactory().getValidator();}public static void validator(BaseForm baseForm) {Set<ConstraintViolation<BaseForm>> validate = validator.validate(baseForm);for (ConstraintViolation<BaseForm> constraintViolation : validate) {String message = constraintViolation.getMessage();throw new BusiException(Constant.PARAM_CHECK_FAILD_CODE,message);}}}

公共类和工具类贴完啦

表比较多,就只贴出一张car表的controller,service代码吧,其它表和它基本类似,都是按照相同的套路,

@RestController
@RequestMapping("/car")
public class BusiCarController {@AutowiredIBusiCarService carService;@RequestMapping("/list.do")@ResponseBodypublic Object list(BusiCarQuery query) {Result rs = carService.queryPage(query);return rs;}@RequestMapping("/addCar.do")@ResponseBodypublic Object addCar(MultipartFile carImg,BusiCarForm form) {//数据校验ValidatorUtil.validator(form);Result rs = carService.add(carImg, form);return rs;}@RequestMapping("/deleteCar.do")@ResponseBodypublic Object deleteCar(@RequestParam("carNum") List<String> carNums) {Result rs = carService.batchDeleteCar(carNums);return rs;}@RequestMapping("/updateCar.do")@ResponseBodypublic Object updateCar(MultipartFile carImg,BusiCarForm form) {//数据校验ValidatorUtil.validator(form);Result rs = carService.update(carImg, form);return rs;}@RequestMapping("/rentCar.do")@ResponseBodypublic Object rentCar(RentForm form) {ValidatorUtil.validator(form);Result rs = carService.rent(form);return rs;}
}
public interface IBusiCarService extends IBaseService<BusiCarForm, BusiCarVO> {public Result batchDeleteCar(List<String> carNums);Result add(MultipartFile carImg, BusiCarForm form);Result update(MultipartFile carImg, BusiCarForm form);public Result rent( RentForm form);}
@Service
public class BusiCarServiceImpl extends BaseServiceImpl<BusiCarForm,BusiCarVO> implements IBusiCarService {@AutowiredBusiCarMapper<BusiCarForm, BusiCarVO> carMapper;@AutowiredBusiCustomerMapper<BusiCustomerForm, BusiCustomerVO> customerMapper;@Autowiredprivate BusRentsMapper<RentForm, BusiCarVO> busRentsMapper;public BusiCarServiceImpl(BusiCarMapper<BusiCarForm, BusiCarVO> carMapper) {super(carMapper);}@Overridepublic Result batchDeleteCar(List<String> carNums) {int rows = carMapper.batchDelete(carNums);if(rows>0) {return new Result();}return new Result(CodeMsg.SYS_DELETE_ERROR);}@Override@Transactionalpublic Result add(MultipartFile carImg, BusiCarForm form) {form.setIsRent(Constant.CAR_NOT_RENT);/*** 保存车辆数据*   1.校验车牌号是否已经被使用*/BusiCarQuery  query = new BusiCarQuery();query.setCarNum(form.getCarNum());//校验车牌号List<BusiCarVO> vos = carMapper.selectList(query);if(!vos.isEmpty()) {return new Result(CodeMsg.BUSI_CAR_NUM_EXIST_ERROR);}//汽车图片存储的目录路径String realPath = WebUtil.getServletContext().getRealPath(Constant.FILE_FOLDER);//上传的文件的名称String originalFilename = carImg.getOriginalFilename();//获取文件后缀String suff = this.fileSuffix(originalFilename);// 产生文件名称  用于保存,String fileName  = form.getCarNum()+suff;form.setImg(Constant.FILE_FOLDER+"/"+fileName);//更新车辆信息carMapper.insert(form);try {carImg.transferTo(new File(realPath+File.separator+fileName));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();throw new BusiException(CodeMsg.BUSI_CAR_IMG_SAVE_ERROR);}return new Result();}private String fileSuffix(String fileName) {return fileName.substring(fileName.lastIndexOf("."));}@Override@Transactionalpublic Result update(MultipartFile carImg, BusiCarForm form) {//汽车图片存储的目录路径String realPath = WebUtil.getServletContext().getRealPath(Constant.FILE_FOLDER);//上传的文件的名称String originalFilename = carImg.getOriginalFilename();//获取文件后缀String suff = this.fileSuffix(originalFilename);// 产生文件名称  用于保存,String fileName  =  form.getCarNum()+suff;form.setImg(Constant.FILE_FOLDER+"/"+fileName);//更新车辆信息carMapper.update(form);//删除车辆之前的图片//String img = vos.get(0).getImg();try {//保存图片carImg.transferTo(new File(realPath+File.separator+fileName));//删除之前的图片//realPath = WebUtil.getServletContext().getRealPath(img);//File file = new File(realPath);//删除之前的文件//if(file.exists()) {//file.delete();//}} catch (Exception e) {e.printStackTrace();throw new BusiException(CodeMsg.BUSI_CAR_IMG_SAVE_ERROR);}return new Result();}@Transactional@Overridepublic Result rent(RentForm form) {//校验身份证号BusiCustomerQuery  query = new BusiCustomerQuery();query.setIdCard(form.getIdCard());List<BusiCustomerVO> vos = customerMapper.selectList(query);if(vos.isEmpty()) {return new Result(CodeMsg.BUSI_RENT_IDCARD_ERROR);}//查询车辆状态BusiCarQuery  carQuery = new BusiCarQuery();carQuery.setCarNum(form.getCarNum());List<BusiCarVO> cars = carMapper.selectList(carQuery);if(cars.isEmpty()) {return new Result(CodeMsg.BUSI_RENT_CARNUM_ERROR);}//校验是否出租if(cars.get(0).getIsRent() == Constant.CAR_RENTED) {return new Result(CodeMsg.BUSI_CAR_RENTED_ERROR);}//修改车辆出租状态int m = carMapper.updateRent(form.getCarNum(), Constant.CAR_RENTED,cars.get(0).getVersion());if(m == 0) {throw new BusiException(CodeMsg.BUSI_CAR_RENT_ERROR);}//创建出租单//创建出租单号String format = DateUtil.format(new Date(), Constant.YMDHMSSS);String rentNo = Constant.CAR_RENT_PRE+format+form.getCarNum();//设置出租单号form.setRentNo(rentNo);SysUserVO  user = WebUtil.getCurrentUser();form.setUserId(user.getId());form.setCreateTime(DateUtil.format(new Date(), Constant.Y_M_D_H_M_S));//计算价格/***  按小时计算  没有满24小时 算  24小时*///校验时间   比较还车时间 大于 租车时间long beginTimes = DateUtil.parse(form.getBeginTime(),Constant.Y_M_D_H_M_S).getTime();long returnTimes = DateUtil.parse(form.getReturnTime(),Constant.Y_M_D_H_M_S).getTime();if(beginTimes > returnTimes) {throw new BusiException(CodeMsg.BUSI_CAR_RENT_TIME_ERROR);}//计算价格double times = returnTimes - beginTimes;double time =  Math.ceil(times/1000.0/60.0/60.0) ;if(time < 24) {form.setPrice(cars.get(0).getRentPrice());}else {// 总小时  *  每小时的租金  int money = (int) (time*(cars.get(0).getRentPrice() / 24));form.setPrice(money);}busRentsMapper.insert(form);return new Result();}

只用父类BaseMapper中的方法肯定是不够的,所以BusiCarMapper中又写了新的方法

public interface BusiCarMapper<F,V> extends BaseMapper<F,V> {public int batchDelete(@Param("carNums") List<String> carNums);public int updateRent(@Param("carNum")String carNum,@Param("rent")Integer rent,@Param("version")Integer version);}

spring和mybatis的配置文件就不贴啦,配置文件都一样,没啥花样。有问题欢迎评论留言

SSM项目-汽车租赁后台管理系统相关推荐

  1. 基于SSM的汽车租赁后台管理系统【完整项目源码】

    1.介绍 包括登录.首页.客户管理.车辆管理.汽车出租.出租单管理.汽车入库.检查单管理.系统管理等功能,适合二次开发课程设计.毕业设计等 2.软件架构 SSM 3.运行环境 数据库 mysql 安装 ...

  2. 基于ssm的汽车租赁管理系统 (源代码+数据库)601

    部分代码地址 https://gitee.com/ynwynwy/carRental-public 基于ssm的汽车租赁管理系统 (源代码+数据库) 一.系统介绍 汽车租赁系统总共分为两个大的模块,分 ...

  3. java计算机毕业设计基于ssm的汽车租赁出租系统(源代码+数据库+Lw文档)

    项目介绍 随着社会的发展,计算机的优势和普及使得汽车租赁系统的开发成为必需.汽车租赁系统主要是借助计算机对汽车租赁信息等信息进行管理.减少管理员的工作,同时也方便广大用户对个人所需汽车租赁信息的及时查 ...

  4. Java毕设项目汽车4S服务管理系统(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目汽车4S服务管理系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(W ...

  5. SSM整合之企业级后台管理系统(18) - 上传头像前端部分

    前面一篇博客<SSM整合之企业级后台管理系统(17) - 上传头像后端部分>介绍了上传头像实现的思路和后端代码,由于篇幅原因呢,把前后端分开介绍. 所以,这篇博客我们来学习一下上传头像的前 ...

  6. 【JavaWeb】JavaWeb项目实战——品牌后台管理系统

    JavaWeb项目实战--品牌后台管理系统 项目概述 功能介绍 成果展示 项目实现 使用Maven构建项目 Maven介绍 具体操作 使用Mybatis封装对数据库的操作 在Mysql中建表,并添加数 ...

  7. 汽车租赁|基于SSM实现汽车租赁管理系统

    作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...

  8. Java项目:汽车租赁系统(java+SSM+JSP+LayUI+echarts+mysql)

    源码获取:博客首页 "资源" 里下载! ssm汽车租赁系统 carRental 系统概要 汽车租赁系统总共分为两个大的模块,分别是系统模块和业务模块.其中系统模块和业务模块底下又有 ...

  9. 计算机实战项目之 论文+辩论PPT+源码等]精品微信小程序ssm校园求职系统+后台管理系统|前后分离VUE

    <微信小程序校园求职系统+后台管理系统|前后分离VUE>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采 ...

最新文章

  1. 2019年,人工智能要落地,更要小心被“摔死”
  2. 意外收获字节跳动内部资料,Android岗
  3. Java使用PDFBox开发包实现对PDF文档内容编辑与保存
  4. 如何配置Filter过滤器处理JSP中文乱码
  5. SQL Server 2000卸载后重新安装的问题
  6. Chrome 96 又更新了 5 个巨巨巨好用的功能
  7. JDBC 编程的分析
  8. 栈的输出_C|简单实现栈、及利用递归将十进制数用其他进制来输出
  9. 《学习笔记》使用AngularJS模板来创建视图
  10. HIT软件构造 软件生命周期 配置管理
  11. opencv区域提取
  12. vue中图片加载不出来的问题
  13. 清华王牌专业建系70年,撑起中国半导体半壁江山,王兴李健都是系友
  14. SEO图片优化小技巧
  15. 7.网络基础配置实验报告(2)
  16. 安卓手机突然很卡_为什么你的安卓手机越用越卡,真是内存不够?终于找到原因了!...
  17. 阿里王坚:用“机器智能”取代“人工智能”概念
  18. warframe在路由器上添加虚拟服务器,卡结算warframe方法
  19. input的type属性值
  20. LAMP 技术简介(4)

热门文章

  1. 九阳破壁机轴承坏只能换刀片总成组件
  2. 给在校同学的几个建议
  3. 董卿:把这10个气质传给孩子
  4. 微信H5支付(MWEB)、扫码支付(NATIVE)、APP支付(APP)
  5. 织梦CMS首页调用分类信息栏目及列表方法
  6. git项目创建、克隆(基于git bash)
  7. 2009年山西省各市GDP排名、城镇居民人均可支配收入排名、农民人均纯收入排名...
  8. 江苏事业单位招聘考计算机专业课,江苏省事业单位计算机专技岗备考指南
  9. 从学术空间通往商业之路 系统性AI芯片专著《人工智能芯片设计》面世
  10. python实现16进制数转ASCII码并写入文本