SSM项目-汽车租赁后台管理系统

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

包结构:

SSM项目-汽车租赁后台管理系统_第1张图片

项目后期又用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公共类
SSM项目-汽车租赁后台管理系统_第2张图片
其中,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的配置文件就不贴啦,配置文件都一样,没啥花样。有问题欢迎评论留言

你可能感兴趣的:(J2EE)