基于javaweb+mysql的ssm+maven服装出租租赁管理系统(java+ssm+html+bootstrap+jquery+mysql)
私信源码获取及调试交流
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb的SSM+Maven服装出租租赁管理系统(java+ssm+html+bootstrap+jquery+mysql)
项目介绍
本项目为后台管理系统; 管理员角色包含以下功能: 管理员登录,用户管理,公告管理,服装类型管理,服装信息管理,客户信息管理,服装出租管理,服装归还管理,查询租还记录,修改个人信息,修改密码等功能。
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;
技术栈
- 后端:Spring SpringMVC MyBatis 2. 前端:JSP+bootstrap+jQuery
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中db.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入localhost:8080/ 管理员账号/密码:admin/admin
/**
* 服装类型
*
* @email sunlightcs@gmail.com
*/
@RestController
@RequestMapping("type")
public class TypeController extends AbstractController {
@Autowired
private TypeService typeService;
/**
* 列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);
List<TypeEntity> typeList = typeService.queryList(query);
int total = typeService.queryTotal(query);
PageUtils pageUtil = new PageUtils(typeList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 列表
*/
@RequestMapping("/list2")
public R list2(@RequestParam Map<String, Object> params){
Query query = new Query(params);
List<TypeEntity> typeList = typeService.queryList(query);
return R.ok().put("list", typeList );
}
/**
* 信息
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody CostumerEntity costumer){
costumerService.update(costumer);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
costumerService.deleteBatch(ids);
return R.ok();
}
}
/**
* 服装信息
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody SysMenuEntity menu){
//数据校验
verifyForm(menu);
sysMenuService.update(menu);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] menuIds){
for(Long menuId : menuIds){
if(menuId.longValue() <= 30){
return R.error("系统菜单,不能删除");
}
}
sysMenuService.deleteBatch(menuIds);
return R.ok();
}
/**
* 用户菜单列表
*/
@RequestMapping("/user")
public R user(){
List<SysMenuEntity> menuList = sysMenuService.getUserMenuList(getUserId());
return R.ok().put("menuList", menuList);
}
/**
* 验证参数是否正确
*/
private void verifyForm(SysMenuEntity menu){
if(StringUtils.isBlank(menu.getName())){
throw new RRException("菜单名称不能为空");
@RestController
@RequestMapping("news")
public class NewsController extends AbstractController {
@Autowired
private NewsService newsService;
/**
* 列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);
List<NewsEntity> newsList = newsService.queryList(query);
int total = newsService.queryTotal(query);
PageUtils pageUtil = new PageUtils(newsList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 列表
*/
@RequestMapping("/list2")
public R list2(@RequestParam Map<String, Object> params){
Query query = new Query(params);
List<NewsEntity> newsList = newsService.queryList(query);
return R.ok().put("list", newsList );
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
NewsEntity news = newsService.queryObject(id);
return R.ok().put("news", news);
}
/**
@RequestMapping("record")
public class RecordController extends AbstractController {
@Autowired
private RecordService recordService;
/**
* 列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<RecordEntity> recordList = recordService.queryList(query);
int total = recordService.queryTotal(query);
PageUtils pageUtil = new PageUtils(recordList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 列表
*/
@RequestMapping("/list2")
public R list2(@RequestParam Map<String, Object> params) {
Query query = new Query(params);
List<RecordEntity> recordList = recordService.queryList(query);
return R.ok().put("list", recordList);
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id) {
RecordEntity record = recordService.queryObject(id);
return R.ok().put("record", record);
}
/**
* 异常处理器
*
* @email sunlightcs@gmail.com
*/
@Component
public class RRExceptionHandler implements HandlerExceptionResolver {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
R r = new R();
try {
response.setContentType("application/json;charset=utf-8");
response.setCharacterEncoding("utf-8");
if (ex instanceof RRException) {
r.put("code", ((RRException) ex).getCode());
r.put("msg", ((RRException) ex).getMessage());
}else if(ex instanceof DuplicateKeyException){
r = R.error("该数据已存在,请重新输入");
}else if(ex instanceof AuthorizationException){
r = R.error("没有权限,请联系管理员授权");
}else{
r = R.error();
}
//记录异常日志
logger.error(ex.getMessage(), ex);
String json = JSON.toJSONString(r);
response.setHeader("Cache-Control", "no-store, no-cache");
response.setContentType("image/jpeg");
//生成文字验证码
String text = String.format("%04d",new Random().nextInt(9999));
//生成图片验证码
BufferedImage image = producer.createImage(text);
//保存到shiro session
ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}
/**
* 登录
*/
@ResponseBody
@RequestMapping(value = "/sys/login", method = RequestMethod.POST)
public R login(String username, String password, String captcha) throws IOException {
// String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
// if(!captcha.equalsIgnoreCase(kaptcha)){
// return R.error("验证码不正确");
// }
try {
Subject subject = ShiroUtils.getSubject();
//sha256加密
// password = new Sha256Hash(password).toHex();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
} catch (UnknownAccountException e) {
return R.error(e.getMessage());
} catch (IncorrectCredentialsException e) {
return R.error(e.getMessage());
} catch (LockedAccountException e) {
return R.error(e.getMessage());
} catch (AuthenticationException e) {
return R.error("账户验证失败");
}
return R.ok();
}
/**
*/
@ResponseBody
@RequestMapping(value = "/sys/reg", method = RequestMethod.POST)
public R reg(String username, String password, String captcha) throws IOException {
// String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
// if(!captcha.equalsIgnoreCase(kaptcha)){
/**
* 通知公告
*
* @email sunlightcs@gmail.com
*/
@RestController
@RequestMapping("news")
public class NewsController extends AbstractController {
@Autowired
private NewsService newsService;
/**
* 列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);
List<NewsEntity> newsList = newsService.queryList(query);
int total = newsService.queryTotal(query);
PageUtils pageUtil = new PageUtils(newsList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 列表
*/
@RequestMapping("/list2")
public R list2(@RequestParam Map<String, Object> params){
Query query = new Query(params);
List<NewsEntity> newsList = newsService.queryList(query);
return R.ok().put("list", newsList );
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
}
/**
* 保存
*/
@RequestMapping("/save")
public R save(@RequestBody NewsEntity news){
newsService.save(news);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody NewsEntity news){
newsService.update(news);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
newsService.deleteBatch(ids);
return R.ok();
}
}
/**
* 登录相关
*
* @email sunlightcs@gmail.com
*/
@Controller
public class SysLoginController {
@Autowired
private Producer producer;
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);
List<TypeEntity> typeList = typeService.queryList(query);
int total = typeService.queryTotal(query);
PageUtils pageUtil = new PageUtils(typeList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 列表
*/
@RequestMapping("/list2")
public R list2(@RequestParam Map<String, Object> params){
Query query = new Query(params);
List<TypeEntity> typeList = typeService.queryList(query);
return R.ok().put("list", typeList );
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
TypeEntity type = typeService.queryObject(id);
return R.ok().put("type", type);
}
/**
* 保存
*/
private void verifyForm(SysMenuEntity menu){
if(StringUtils.isBlank(menu.getName())){
throw new RRException("菜单名称不能为空");
}
if(menu.getParentId() == null){
throw new RRException("上级菜单不能为空");
}
//菜单
if(menu.getType() == Constant.MenuType.MENU.getValue()){
if(StringUtils.isBlank(menu.getUrl())){
throw new RRException("菜单URL不能为空");
}
}
//上级菜单类型
int parentType = Constant.MenuType.CATALOG.getValue();
if(menu.getParentId() != 0){
SysMenuEntity parentMenu = sysMenuService.queryObject(menu.getParentId());
parentType = parentMenu.getType();
}
//目录、菜单
if(menu.getType() == Constant.MenuType.CATALOG.getValue() ||
menu.getType() == Constant.MenuType.MENU.getValue()){
if(parentType != Constant.MenuType.CATALOG.getValue()){
throw new RRException("上级菜单只能为目录类型");
}
return ;
}
//按钮
if(menu.getType() == Constant.MenuType.BUTTON.getValue()){
if(parentType != Constant.MenuType.MENU.getValue()){
throw new RRException("上级菜单只能为菜单类型");
}
return ;
}
}
}
//生成文字验证码
String text = String.format("%04d",new Random().nextInt(9999));
//生成图片验证码
BufferedImage image = producer.createImage(text);
//保存到shiro session
ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}
/**
* 登录
*/
@ResponseBody
@RequestMapping(value = "/sys/login", method = RequestMethod.POST)
public R login(String username, String password, String captcha) throws IOException {
// String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
// if(!captcha.equalsIgnoreCase(kaptcha)){
// return R.error("验证码不正确");
// }
try {
Subject subject = ShiroUtils.getSubject();
//sha256加密
// password = new Sha256Hash(password).toHex();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
} catch (UnknownAccountException e) {
return R.error(e.getMessage());
} catch (IncorrectCredentialsException e) {
return R.error(e.getMessage());
} catch (LockedAccountException e) {
return R.error(e.getMessage());
} catch (AuthenticationException e) {
return R.error("账户验证失败");
}
return R.ok();
}
/**
*/
@ResponseBody
@RequestMapping(value = "/sys/reg", method = RequestMethod.POST)
public R reg(String username, String password, String captcha) throws IOException {
// String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
// if(!captcha.equalsIgnoreCase(kaptcha)){
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
costumerService.deleteBatch(ids);
return R.ok();
}
}
/**
* 服装信息
*
* @email sunlightcs@gmail.com
*/
@RestController
@RequestMapping("cloth")
public class ClothController extends AbstractController {
@Autowired
private ClothService clothService;
/**
* 文件上传
*
* @email syt12322@163.com
*/
@RestController
@RequestMapping("file")
public class UploadController {
public static String[] suffixs = {"IMG", "PNG", "JPG", "JPEG", "GIF", "BPM"};
/**
* 上传文件
*/
@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
if (file.isEmpty()) {
throw new RRException("上传文件不能为空");
}
String url = MultipartFileUtil.uploadFile("/cdn", file, request);
return R.ok().put("url", url);
}
response.setContentType("application/json;charset=utf-8");
response.setCharacterEncoding("utf-8");
if (ex instanceof RRException) {
r.put("code", ((RRException) ex).getCode());
r.put("msg", ((RRException) ex).getMessage());
}else if(ex instanceof DuplicateKeyException){
r = R.error("该数据已存在,请重新输入");
}else if(ex instanceof AuthorizationException){
r = R.error("没有权限,请联系管理员授权");
}else{
r = R.error();
}
//记录异常日志
logger.error(ex.getMessage(), ex);
String json = JSON.toJSONString(r);
response.getWriter().print(json);
} catch (Exception e) {
logger.error("RRExceptionHandler 异常处理失败", e);
}
return new ModelAndView();
}
}
/**
* 系统页面视图
*
* @email sunlightcs@gmail.com
*/
@Controller
public class SysPageController {
/**
* 系统菜单
*
* @email sunlightcs@gmail.com
*/
@RestController
@RequestMapping("/sys/menu")
public class SysMenuController extends AbstractController {
@Autowired
private SysMenuService sysMenuService;
/**
* 所有菜单列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//查询列表数据
Query query = new Query(params);
List<SysMenuEntity> menuList = sysMenuService.queryList(query);
int total = sysMenuService.queryTotal(query);
PageUtils pageUtil = new PageUtils(menuList, total, query.getLimit(), query.getPage());
return R.ok().put("page", pageUtil);
}
/**
* 选择菜单(添加、修改菜单)
*/
@RequestMapping("/select")
public R select(){
menuList = sysMenuService.queryList(new HashMap<String, Object>());
}else{
menuList = sysMenuService.queryUserList(getUserId());
}
return R.ok().put("menuList", menuList);
}
/**
* 菜单信息
*/
@RequestMapping("/info/{menuId}")
public R info(@PathVariable("menuId") Long menuId){
SysMenuEntity menu = sysMenuService.queryObject(menuId);
return R.ok().put("menu", menu);
}
/**
* 保存
*/
@RequestMapping("/save")
public R save(@RequestBody SysMenuEntity menu){
//数据校验
verifyForm(menu);
sysMenuService.save(menu);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody SysMenuEntity menu){
//数据校验
verifyForm(menu);
sysMenuService.update(menu);
return R.ok();
}
/**
* 删除
*/