使用SSM和layui做了一个汽车租赁后台管理系统,功能还没有完善,先发出来再慢慢完善更新
包结构:
项目后期又用Maven整合了一下,jar包太多,把pom贴出来好了
pom.xml
<properties>
<aspectjweaver.version>1.9.4aspectjweaver.version>
<classmate.version>1.3.4classmate.version>
<commons-fileupload.version>1.3.1commons-fileupload.version>
<commons-lang3.version>3.9commons-lang3.version>
<commons-logging.version>1.2commons-logging.version>
<druid.version>1.0.28druid.version>
<fastjson.version>1.2.62fastjson.version>
<hibernate-validator.version>5.1.1.Finalhibernate-validator.version>
<hutool-all.version>4.6.10hutool-all.version>
<jackson-annotations.version>2.9.9jackson-annotations.version>
<jackson-core.version>2.9.9jackson-core.version>
<jackson-databind.version>2.9.9jackson-databind.version>
<jsqlparser.version>1.3jsqlparser.version>
<jstl.version>1.2jstl.version>
<log4j.version>1.2.17log4j.version>
<mybatis.version>3.5.0mybatis.version>
<mybatis-spring.version>1.3.3mybatis-spring.version>
<mysql-connector-java.version>5.1.47mysql-connector-java.version>
<pagehelper.version>5.1.8pagehelper.version>
<spring.version>5.2.0.RELEASEspring.version>
<standard.version>1.1.2standard.version>
<javax.servlet-api.version>3.1.0javax.servlet-api.version>
<jsp-api.version>2.2jsp-api.version>
properties>
<dependencies>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>${aspectjweaver.version}version>
dependency>
<dependency>
<groupId>com.fasterxmlgroupId>
<artifactId>classmateartifactId>
<version>${classmate.version}version>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>${commons-fileupload.version}version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>${commons-lang3.version}version>
dependency>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>${commons-logging.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>${druid.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>${fastjson.version}version>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-validatorartifactId>
<version>${hibernate-validator.version}version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>${hutool-all.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>${jackson-annotations.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>${jackson-core.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>${jackson-databind.version}version>
dependency>
<dependency>
<groupId>com.github.jsqlparsergroupId>
<artifactId>jsqlparserartifactId>
<version>${jsqlparser.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>${jstl.version}version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>${log4j.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>${mybatis.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>${mybatis-spring.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql-connector-java.version}version>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>${pagehelper.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-oxmartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>${standard.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>${javax.servlet-api.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>${jsp-api.version}version>
<scope>providedscope>
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;
}
@Override
public Result add(F form) {
int row = baseMapper.insert(form);
if(row>0) {
return new Result();
}
return new Result(CodeMsg.SYS_ADD_ERROR);
}
@Override
public Result delete(Integer id) {
// TODO Auto-generated method stub
return null;
}
@Override
public Result queryOne(Integer id) {
// TODO Auto-generated method stub
return null;
}
@Override
public Result queryList(BaseQuery query) {
List<V> list = baseMapper.selectList(query);
if(null == list) {
return new Result(CodeMsg.SYS_QUERY_ERROR);
}
return new Result(list);
}
@Override
public 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);
}
@Override
public 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 block
e.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)
@ResponseBody
public 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 {
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
//获取 context
ServletContext 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 {
@Autowired
IBusiCarService carService;
@RequestMapping("/list.do")
@ResponseBody
public Object list(BusiCarQuery query) {
Result rs = carService.queryPage(query);
return rs;
}
@RequestMapping("/addCar.do")
@ResponseBody
public Object addCar(MultipartFile carImg,BusiCarForm form) {
//数据校验
ValidatorUtil.validator(form);
Result rs = carService.add(carImg, form);
return rs;
}
@RequestMapping("/deleteCar.do")
@ResponseBody
public Object deleteCar(@RequestParam("carNum") List<String> carNums) {
Result rs = carService.batchDeleteCar(carNums);
return rs;
}
@RequestMapping("/updateCar.do")
@ResponseBody
public Object updateCar(MultipartFile carImg,BusiCarForm form) {
//数据校验
ValidatorUtil.validator(form);
Result rs = carService.update(carImg, form);
return rs;
}
@RequestMapping("/rentCar.do")
@ResponseBody
public 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 {
@Autowired
BusiCarMapper<BusiCarForm, BusiCarVO> carMapper;
@Autowired
BusiCustomerMapper<BusiCustomerForm, BusiCustomerVO> customerMapper;
@Autowired
private BusRentsMapper<RentForm, BusiCarVO> busRentsMapper;
public BusiCarServiceImpl(BusiCarMapper<BusiCarForm, BusiCarVO> carMapper) {
super(carMapper);
}
@Override
public Result batchDeleteCar(List<String> carNums) {
int rows = carMapper.batchDelete(carNums);
if(rows>0) {
return new Result();
}
return new Result(CodeMsg.SYS_DELETE_ERROR);
}
@Override
@Transactional
public 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 block
e.printStackTrace();
throw new BusiException(CodeMsg.BUSI_CAR_IMG_SAVE_ERROR);
}
return new Result();
}
private String fileSuffix(String fileName) {
return fileName.substring(fileName.lastIndexOf("."));
}
@Override
@Transactional
public 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
@Override
public 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的配置文件就不贴啦,配置文件都一样,没啥花样。有问题欢迎评论留言