这两月我用了这么久的时间写的项目,无偿分享给大家。首先,先申明这里面代码非常多bug,还有很多功能没有完成,紧靠一个学生实在太难了。那么我先讲讲项目的bug,以及未完成的功能,避免大家找到又说坏话。还有项目有部分个人隐私,大家看到就当没看到吧,反正我的信息又不值几个钱。哈哈~~~

一、如果出现断网,后台增加房间或修改房间信息,可能会出现致命bug,事务未回滚,这个是我自己写出来的bug,可以修改。将所有的sql封装在一个方法里,不要写在其他DAO层。这个可解决,懒得改了。
二、登录按钮这个指向的是个人域名,有需要的朋友下次再说。
三、这个用户页面是可以通过微信打开,里面有微信开发。不过登录好像有如果你在微信授权登录后,且不选择绑定邮箱登录,很可能会出现bug,想要进行操作,一直要你登录。
- 封面设置点击后会出现心形符号,就是选中了封面。如果没有选中图片,默认第一张为封面。
- 邮箱可能发送接收不到,有可能被视为垃圾邮箱或被退回邮件。
- 用户页面不兼容电脑端,只能以手机端查看,否则出现部分页面无法正常显示。请以移动端查看。
- 用户界面的图片是可以点开查看所有图片,没有提示内容,可以左滑动,滑不动就是只有一张图片。
- 标签筛选是可以多选,有几个没有,所以为空。
- 添加房间有可能服务器的穿透突然断网,重新连接后,重复添加数据。造成重复数据添加异常。
- 添加的设施,分为便利设施和媒体科技,这个设施只是分类,需要同时选中,否则会出现空指针异常。
- 在微信对接使用,不可使用支付宝沙箱,微信会拦截,只能在网页上充值余额后,在微信上余额支付订单。
好了,大概就这样吧!
下面我讲讲项目的流程以及项目的功能。

这个东西有想看,因为时间紧迫,就打包放在云盘里。
微信要用到穿透,以及域名的购买。
穿透软件我这里用的https://www.ngrok.cc/login.html,大家下好穿透软件,当然这里面有免费,但是网速非常慢,用花钱的好像也只是速度快了些,但是又有许多问题。
运行环境:ecplise+mysql+穿透+域名(最好使用服务器,当然服务器暂时没有备案测试,可能会出现意外收获bug)
穿透的使用




到这里,穿透就可以使用了,不过域名得自己购买。访问的使用就是域名加项目名。
因为每次图片重启项目都会清空图片,这样子对于我们来说很不方便,为此做了以下配置。
在配置前首先把tomcat中的项目先全部remove All,然后clean掉,然后双击控制台的servers的tomcat,打开tomcat配置,修改默认的项目存放路径。

在apache-tomcat创建一个文件夹,然后将图片存放在这个文件夹下。

在server.xml里配置对应的路径,docBase:图片存放的绝对路径,path:相对项目的图片文件夹路径
在eclipse中的servers打开server.xml配置
下面就是代码了,因为代码过多,只发重要部分,其他部分大家可以直接看百度云盘项目。
一个serlvet父类,可以简化servlet代码
package com.lisonglin.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("utf-8");
String uri = req.getRequestURI();
String method = uri.substring(uri.lastIndexOf("/")+1);
try {
Method m = this.getClass().getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class);
m.invoke(this, req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
protected void outPut(HttpServletRequest request, HttpServletResponse response, String jsonStr)
throws ServletException, IOException {
response.setContentType("application/json;charset=utf-8");// 指定返回的格式为JSON格式
response.setCharacterEncoding("UTF-8");// setContentType与setCharacterEncoding的顺序不能调换,否则还是无法解决中文乱码的问题
PrintWriter out = null;
out = response.getWriter();
out.write(jsonStr);
out.close();
}
}
这里是主要的后台管理实现
package com.lisonglin.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lisonglin.daomain.Bed;
import com.lisonglin.daomain.Easy;
import com.lisonglin.daomain.HotelLocal;
import com.lisonglin.daomain.Locals;
import com.lisonglin.daomain.Media;
import com.lisonglin.daomain.RoomArea;
import com.lisonglin.daomain.RoomLevel;
import com.lisonglin.daomain.Rooms;
import com.lisonglin.daomain.Window;
import com.lisonglin.service.BedService;
import com.lisonglin.service.EasyService;
import com.lisonglin.service.FacilitiesService;
import com.lisonglin.service.HotelLocalService;
import com.lisonglin.service.ImageService;
import com.lisonglin.service.LocalsService;
import com.lisonglin.service.MediaService;
import com.lisonglin.service.PreviewService;
import com.lisonglin.service.RoomAreaService;
import com.lisonglin.service.RoomEasyService;
import com.lisonglin.service.RoomHotelLocalService;
import com.lisonglin.service.RoomLevelService;
import com.lisonglin.service.RoomMediaService;
import com.lisonglin.service.RoomTitleService;
import com.lisonglin.service.RoomsService;
import com.lisonglin.service.WindowService;
import com.lisonglin.service.impl.BedImpl;
import com.lisonglin.service.impl.EasyImpl;
import com.lisonglin.service.impl.FacilitatiesImpl;
import com.lisonglin.service.impl.HotelLocalImpl;
import com.lisonglin.service.impl.ImageImpl;
import com.lisonglin.service.impl.LocalsImpl;
import com.lisonglin.service.impl.MediaImpl;
import com.lisonglin.service.impl.PreviewImpl;
import com.lisonglin.service.impl.RoomAreaImpl;
import com.lisonglin.service.impl.RoomEasyImpl;
import com.lisonglin.service.impl.RoomHotelLocalImpl;
import com.lisonglin.service.impl.RoomLevelImpl;
import com.lisonglin.service.impl.RoomMediaImpl;
import com.lisonglin.service.impl.RoomTitleImpl;
import com.lisonglin.service.impl.RoomsImpl;
import com.lisonglin.service.impl.WindowImpl;
import com.lisonglin.utils.DataUtil;
import com.lisonglin.utils.ProxyUtil;
import com.lisonglin.utils.UploadUtil;
@WebServlet("/rooms/*")
public class RoomServlet2 extends BaseServlet{
private static final long serialVersionUID = 1L;
protected void getAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查询全部房间
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
List<Rooms> room = rService.getAllRoom();
req.setAttribute("rooms", room);
//回显到查询出全部修改
getRooms(req);
//将图片的base64码添加进XML,再从前台读出XML中base64显示在浏览器中
req.getRequestDispatcher("/admin/administration.jsp").forward(req, resp);
}
private void getRooms(HttpServletRequest req) {
//查询房间级别
RoomLevelService roomLevelService=(RoomLevelService) ProxyUtil.getProxy(new RoomLevelImpl());
List<RoomLevel> roomLevels = roomLevelService.getRoomLevels();
//查询床类型
BedService bService= (BedService) ProxyUtil.getProxy(new BedImpl());
List<Bed> beds = bService.getBeds();
//查询窗类型
WindowService windowService=(WindowService) ProxyUtil.getProxy(new WindowImpl());
List<Window> windows=windowService.getWindows();
//查询房间面积
RoomAreaService roomsService= (RoomAreaService) ProxyUtil.getProxy(new RoomAreaImpl());
List<RoomArea> roomArea = roomsService.getRoomArea();
//查询便利设施
EasyService roomEasyService=(EasyService) ProxyUtil.getProxy(new EasyImpl());
List<Easy> roomEasies = roomEasyService.getRoomEasies();
//查询媒体科技
MediaService mediaService=(MediaService) ProxyUtil.getProxy(new MediaImpl());
List<Media> medias = mediaService.getMedias();
//查询酒店标签
HotelLocalService hotelLocalService= (HotelLocalService) ProxyUtil.getProxy(new HotelLocalImpl());
List<HotelLocal> hotelLocal = hotelLocalService.getHotelLocal();
//查询标题标签
LocalsService lService=(LocalsService) ProxyUtil.getProxy(new LocalsImpl());
List<Locals> locals = lService.getLocals();
req.setAttribute("roomlevels", roomLevels);
req.setAttribute("beds", beds);
req.setAttribute("windows", windows);
req.setAttribute("area", roomArea);
req.setAttribute("easy", roomEasies);
req.setAttribute("medias", medias);
req.setAttribute("hotelLocal", hotelLocal);
req.setAttribute("locals", locals);
}
protected void updateRoom(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//对文件的删除和上传,修改房间信息
//上传文件
UploadUtil uploadUtil=new UploadUtil();
List upload = uploadUtil.upload(req);
boolean flag=true;
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
FacilitiesService fService=(FacilitiesService) ProxyUtil.getProxy(new FacilitatiesImpl());
RoomHotelLocalService roomHotelLocalService=(RoomHotelLocalService) ProxyUtil.getProxy(new RoomHotelLocalImpl());
PreviewService previewService=(PreviewService)ProxyUtil.getProxy(new PreviewImpl());
RoomMediaService rMediaService=(RoomMediaService) ProxyUtil.getProxy(new RoomMediaImpl());
RoomEasyService rEasyService=(RoomEasyService) ProxyUtil.getProxy(new RoomEasyImpl());
String easy = null,medias = null,hotellocal = null,price="";
String room="";
String path="",heart_img="";
try {
String level = null;
String local = null;
String window = null;
String bed = null;
String area = null;
Object id=null;
Object preview =null;
int roomHotelLocal=0;
for(int i=0;i<upload.size();i++) {
System.out.println(upload.get(i));
String rooms= String.valueOf(upload.get(i));
//用户修改的表单数据
if(rooms.contains("room=")) {
String[] arr = rooms.split("&");
//根据表单数据,查询出相应的id
for(int j=0;j<arr.length;j++) {
System.out.println("arr:"+arr[j]);
if(arr[j].contains("room")) {
room = arr[j].replaceAll("[^0-9]", "");
System.out.println("room:"+room);
//查询要修改的设施id
id=fService.getFaciliteid(room);
//删除原来的设施
fService.deleteFacilities(Integer.parseInt(room));
//查询要修改的标签id
roomHotelLocal = roomHotelLocalService.getRoomHotelLocal(room);
//删除原来的标签
roomHotelLocalService.deleteRoomHotelLocal(room);
System.out.println("roomHotelLocal:"+roomHotelLocal);
//查询要修改的图片id
preview = previewService.getPreview(room);
}else if(arr[j].contains("levels")) {
level = arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("local")) {
local=arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("window")) {
window=arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("bed")) {
bed=arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("area")) {
area=arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("price")) {
price=arr[j].replaceAll("[^0-9]", "");
}else if(arr[j].contains("easy")) {
easy=arr[j].replaceAll("[^0-9]", "");
System.out.println("roomid:"+room);
//新增设施
rEasyService.addEasy(Integer.parseInt(id+""), Integer.parseInt(easy));
}else if(arr[j].contains("medias=")) {
medias=arr[j].replaceAll("[^0-9]", "");
//新增设施
rMediaService.addRoomMedia(Integer.parseInt(id+""),Integer.parseInt(medias));
}
if(arr[j].contains("hotellocal")) {
hotellocal=arr[j].replaceAll("[^0-9]", "");
roomHotelLocalService.addRoomHotelLocal(roomHotelLocal, Integer.parseInt(hotellocal));
}
}
}
//删除的图片
if(rooms.contains("deleteImg=")) {
String deleteimg = rooms.substring(rooms.indexOf("=")+1,rooms.length());
previewService.deletePreview(preview+"", deleteimg);
}
//用户上传的图片
if(rooms.contains("files=")) {
String uploadpath = rooms.substring(rooms.indexOf("=")+1,rooms.length());
String uploadimg = uploadpath.substring(uploadpath.lastIndexOf("/")+1,uploadpath.length());
previewService.addPreview(preview+"", uploadimg, uploadpath);
}
//封面
if(rooms.contains("heart_img=")) {
heart_img = rooms.substring(rooms.indexOf("=")+1,rooms.length());
String rowpath = req.getServletContext().getRealPath("/");
// 获取当前时间
String xdPath = "images/";
path = rowpath + xdPath+heart_img;
}
}
rService.updateRoom(level, window, area, bed, Double.parseDouble(price), level, local, path, heart_img, room);
}catch (Exception e) {
e.printStackTrace();
flag=false;
}
resp.getWriter().write(flag==true?"success":"error");
}
protected void getAddRoom(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getRooms(req);
req.getRequestDispatcher("/admin/add.jsp").forward(req, resp);
}
//添加房间
@SuppressWarnings("unlikely-arg-type")
protected void addRoom(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("utf-8");
//上传文件
UploadUtil uploadUtil=new UploadUtil();
List upload = uploadUtil.upload(req);
//增加房间(rooms)
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
ImageService imageService=(ImageService) ProxyUtil.getProxy(new ImageImpl());
RoomTitleService roomTitleService= (RoomTitleService) ProxyUtil.getProxy(new RoomTitleImpl());
RoomEasyService roomEasyService=(RoomEasyService) ProxyUtil.getProxy(new RoomEasyImpl());
FacilitiesService fService=(FacilitiesService) ProxyUtil.getProxy(new FacilitatiesImpl());
MediaService mediaService=(MediaService) ProxyUtil.getProxy(new MediaImpl());
RoomHotelLocalService roomHotelLocalService=(RoomHotelLocalService) ProxyUtil.getProxy(new RoomHotelLocalImpl());
RoomAreaService roomAreaService=(RoomAreaService) ProxyUtil.getProxy(new RoomAreaImpl());
//查询最大的设施号
int facilite = fService.getFacilite();
//查询最大的标签号
int roomHotelLocal = roomHotelLocalService.getRoomHotelLocal();
//查询最大的照片号
int iamges = imageService.getIamges();
String easy = null,medias = null,hotellocal = null,price="",newimg="",local="",roomlevel="";
String room="",level="",window="",bed="",area="",imgs="",oldimg="";
//查询增加面积的对应id
int roomArea = roomAreaService.getRoomAreas();
//查询最大的标题号
int roomTitle = roomTitleService.getRoomTitle();
try {
for(int i=0;i<upload.size();i++) {
//各类相应的数据
String rooms= String.valueOf(upload.get(i));
System.out.println("rooms:"+rooms);
if(rooms.contains("&")) {
System.out.println(rooms.contains("&"));
String[] arr = rooms.split("&");
//房间号
room = (arr[0]+"").replaceAll("[^0-9]", "");
//标题
local=(arr[1]+"").replaceAll("[^0-9]", "");
roomlevel=(arr[2]+"").replaceAll("[^0-9]", "");
//级别
level=(arr[3]+"").replaceAll("[^0-9]", "");
//窗
window=(arr[4]+"").replaceAll("[^0-9]", "");
//床
bed=(arr[5]+"").replaceAll("[^0-9]", "");
//面积
area=(arr[6]+"").replaceAll("[^0-9]", "");
for(int j = 0; j < arr.length;j++){
System.out.println("arr:"+arr[j]);
//设施(便利设施)
if(rooms.contains("easy")) {
if((arr[j]+"").contains("easy")) {
easy=(arr[j]+"").replaceAll("[^0-9]","");
// System.out.println("facilite:"+facilite);
//增加房间设施(room_easy)
roomEasyService.addEasy(facilite+1, Integer.parseInt(easy));
}
}else {
System.out.println("easyno");
resp.getWriter().write("no");
return;
}
//媒体科技
if(rooms.contains("medias")) {
if((arr[j]+"").contains("easy")) {
medias=(arr[j]+"").replaceAll("[^0-9]", "");
// System.out.println("medias:"+medias);
mediaService.addMedias(facilite+1, Integer.parseInt(medias));
}
}else {
System.out.println("no");
resp.getWriter().write("no");
return;
}
//标签
if(rooms.contains("hotellocal")) {
if((arr[j]+"").contains("easy")) {
//增加酒店房间标签(room_hotel_loc)
hotellocal=(arr[j]+"").replaceAll("[^0-9]", "");
// System.out.println("hotellocal:"+(roomHotelLocal+1));
roomHotelLocalService.addRoomHotelLocal(roomHotelLocal+1, Integer.parseInt(hotellocal));
}
}else {
System.out.println("hotelno");
resp.getWriter().write("no");
return;
}
//价格
if((arr[j]+"").contains("price")) {
price=(arr[j]+"").replaceAll("[^0-9]", "");
}
}
System.out.println(room+","+local+","+roomlevel+","+level+","+window+","+bed+","+area+","+easy+","+medias+","+hotellocal+","+price);
}
imgs =String.valueOf(upload.get(i));
// System.out.println("imgs:"+imgs);
if(String.valueOf(upload.get(0))!=null) {
if(imgs.contains("E://apache")) {
//直接截取后面的文件名
oldimg = imgs.substring(imgs.lastIndexOf("//")+1,imgs.length());
System.out.println("imgok");
//增加房间照片(img_md5,preview)
imageService.addIamges(iamges+1,"", imgs, oldimg);
newimg=imgs.substring(0,imgs.lastIndexOf("//"));
System.out.println("room:"+room+"oldimg:"+oldimg);
//照片
}
}else {
System.out.println("imgno");
return;
}
}
//增加图片的md5加密的数据库
//最后添加设施关联表
fService.addFacilite(facilite+1, facilite+1);
//增加房间封面
if(String.valueOf(upload.get(0)).equals("")) {
System.out.println("123imgno");
return;
}
imageService.addImages(iamges+1,newimg+"/"+String.valueOf(upload.get(0)), Integer.parseInt(room), String.valueOf(upload.get(0)));
System.out.println("roomTitle:"+roomTitle);
//增加房间标题(roomtitle)
roomTitleService.addRoomTitle(roomTitle+1,Integer.parseInt(local), Integer.parseInt(roomlevel));
//增加面积
if(area!=null) {
roomAreaService.addRoomArea(roomArea+1,Integer.parseInt(area));
}
//查询设施id
int faciliteid = fService.getFaciliteid();
//增加房间
System.out.println("room:"+room+",level:"+level+",window:"+window+",rooomArea:"+roomArea+",bed:"+bed+",price:"+price+",roomTitle:"+roomTitle+",images:"+iamges+",faciliteid:"+faciliteid+",roomHotellocal:"+roomHotelLocal);
rService.addRoom(Integer.parseInt(room), Integer.parseInt(level),Integer.parseInt(window) ,
roomArea+1, Integer.parseInt(bed), Integer.parseInt(price), roomTitle+1, iamges+1,
faciliteid, roomHotelLocal+1);
//封面
//图片的绝对路径
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("其他异常");
}
//重定向
// resp.sendRedirect("/hotelSystem/room/getAll");
System.out.println("封面:"+upload.get(0));
System.out.println("upload:"+upload);
if(room!=null&&level!=null&&bed!=null) {
System.out.println("ok");
}else {
System.out.println("no");
}
//上面执行成功后,返回前台成功
resp.getWriter().write(room!=null?"add":"no");
}
//后台验证房间号
protected void checkRoomId(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据url传过来的参数
String roomid = req.getParameter("roomid");
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
Object id = rService.checkRoomId(roomid);
resp.getWriter().write(id==null?"success":"error");
}
//查询预览图片
protected void getIamges(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据封面id
String oldimg = req.getParameter("oldimg");
ImageService imageService=(ImageService) ProxyUtil.getProxy(new ImageImpl());
String imgpath=imageService.getIamgesPath(oldimg);
System.out.println("imgpath:"+imgpath);
req.setAttribute("imgpath", imgpath);
req.getRequestDispatcher("/admin/img.jsp").forward(req, resp);
}
//搜索框输入的内容
protected void checkRoomData(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String roomid = req.getParameter("data");
System.out.println(roomid);
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
if(roomid.equals("")) {
List<Rooms> room = rService.getAllRoom();
req.setAttribute("rooms", room);
resp.getWriter().write("all");
req.getRequestDispatcher("/admin/administration.jsp").forward(req, resp);
}else if(!DataUtil.isInteger(roomid)){
System.out.println("null");
resp.getWriter().write("null");
}else {
resp.getWriter().write("success");
List<Rooms> likeRoom = rService.getLikeRoom(roomid);
req.setAttribute("rooms", likeRoom);
req.getRequestDispatcher("/admin/administration.jsp").forward(req, resp);
}
System.out.println("roomid:"+roomid);
}
//删除选中的房间
protected void deleteRoom(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
System.out.println("id:"+id);
RoomsService rService= (RoomsService) ProxyUtil.getProxy(new RoomsImpl());
try {
boolean deleteRoom = rService.deleteRoom(id);
if(deleteRoom) {
resp.getWriter().write("success");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("其他异常");
}
}
//查询窗户和床
protected void bedorwindow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
WindowService windowService=(WindowService) ProxyUtil.getProxy(new WindowImpl());
List<Window> windows = windowService.getWindows();
BedService bedService=(BedService) ProxyUtil.getProxy(new BedImpl());
List<Bed> beds = bedService.getBeds();
req.setAttr

本文作者分享了一个未完成的JavaWeb酒店管理系统项目,包括前端用户界面、后台管理及微信对接功能。项目存在多个bug和未实现的部分,作者提醒注意个人隐私和不得用于商业。涉及内容包括:微信授权登录、图片存储配置、事务管理问题、服务器穿透和域名设置等。提供部分关键代码和项目下载链接,强调仅供学习,不保证能直接运行。
最低0.47元/天 解锁文章
1763

被折叠的 条评论
为什么被折叠?



