(附源码)Springboot酒店预订管理系统 毕业设计 100908

发布时间:2024-07-18 15:52:21    浏览:

  系统实现

  数据库访问层的实现

  该系统是通过jdbc和MySQL达成连接的,新建一个jdbc.properties文件来填写与数据库连接所需要的驱动和参数。

  jdbc.driverClass=com.MySQL.jdbc.Driver

  jdbc.url=jdbc:MySQL://localhost:3306/tsi

  jdbc.username=root

  jdbc.password=123

  第一个参数代表MySQL数据库的驱动,第二个参数代表要连接的数据库,第三个和第四个参数代表数据库连接名和密码。

  后台与数据库访问主要是通过HQL语句来进行查询的,查询语句中的表名是表格的实体类名,在这种查询语句中*是不允许使用的,除非适合聚合函数一起使用才可以。

  注册模块的实现

  用户在填写数据的时候必须与注册页面上的验证相匹配否则会注册失败,注册页面的表单验证是通过JavaScript进行验证的,用户名的长度必须在6到18之间,邮箱必须带有@符号,密码和密码确认必须相同,你输入的密码,系统会根据你输入密码的强度给出指定的值,电话号码和身份证号码必须要求输入格式与生活相符合,当你前台验证通过的时候你点击注册,表单会将你输入的值通过name值传递给后台并保存到数据库中。

  用户注册流程图如下图所示。

  

  图5-1用户注册流程图

  用户注册界面如下图所示。

  

  图5-2用户注册界面

  用户注册的关键代码如下。

  /**

  * 注册

  * @param user

  * @return

  */

  @PostMapping("register")

  public Map<String, Object> signUp(@RequestBody User user) {

  // 查询用户

  Map<String, String> query = new HashMap<>();

  query.put("username",user.getUsername());

  List list = service.select(query, new HashMap<>()).getResultList();

  if (list.size()>0){

  return error(30000, "用户已存在");

  }

  user.setUserId(null);

  user.setPassword(service.encryption(user.getPassword()));

  service.save(user);

  return success(1);

  }

  /**

  * 用户ID:[0,8388607]用户获取其他与用户相关的数据

  */

  @Id

  @GeneratedValue(strategy = GenerationType.IDENTITY)

  @Column(name = "user_id")

  private Integer userId;

  /**

  * 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)

  */

  @Basic

  @Column(name = "state")

  private Integer state;

  /**

  * 所在用户组:[0,32767]决定用户身份和权限

  */

  @Basic

  @Column(name = "user_group")

  private String userGroup;

  /**

  * 上次登录时间:

  */

  @Basic

  @Column(name = "login_time")

  private Timestamp loginTime;

  /**

  * 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时

  */

  @Basic

  @Column(name = "phone")

  private String phone;

  /**

  * 手机认证:[0,1](0未认证|1审核中|2已认证)

  */

  @Basic

  @Column(name = "phone_state")

  private Integer phoneState;

  /**

  * 用户名:[0,16]用户登录时所用的账户名称

  */

  @Basic

  @Column(name = "username")

  private String username;

  /**

  * 昵称:[0,16]

  */

  @Basic

  @Column(name = "nickname")

  private String nickname;

  /**

  * 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成

  */

  @Basic

  @Column(name = "password")

  private String password;

  /**

  * 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时

  */

  @Basic

  @Column(name = "email")

  private String email;

  /**

  * 邮箱认证:[0,1](0未认证|1审核中|2已认证)

  */

  @Basic

  @Column(name = "email_state")

  private Integer emailState;

  /**

  * 头像地址:[0,255]

  */

  @Basic

  @Column(name = "avatar")

  private String avatar;

  /**

  * 创建时间:

  */

  @Basic

  @Column(name = "create_time")

  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

  private Timestamp createTime;

  @Basic

  @Transient

  private String code;

  }

  登录模块的实现

  主要由两部分组成,登录前的登录界面以及登录后的用户功能界面。登录界面,要求用户输入用户名和密码,当用户名和密码其中一个输入为空时,给出提示“用户名,密码不能为空”。获取用户名和密码后到数据库中查找,如果用户名存在,以及对应的密码正确,则登录成功,否则登录失败。登录失败后给出提示,并把焦点停在文本框中。登录成功后将该次会话的全局变量username设置为用户名。登录成功后进入会员的功能模块,主要有会员基本信息修改,已经发布商品信息管理,发布信息,和退出功能。退出功能是清除全局变量username的值,并跳回到首页。

  登录流程图如下图所示。

  

  图5-3登录流程图

  用户登录界面如下图所示。

  

  图5-4用户登录界面

  用户登录的关键代码如下。

  /**

  * 登录

  * @param data

  * @param httpServletRequest

  * @return

  */

  @PostMapping("login")

  public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

  log.info("[执行登录接口]");

  String username = data.get("username");

  String email = data.get("email");

  String phone = data.get("phone");

  String password = data.get("password");

  List resultList = null;

  Map<String, String> map = new HashMap<>();

  if(username != null && "".equals(username) == false){

  map.put("username", username);

  resultList = service.select(map, new HashMap<>()).getResultList();

  }

  else if(email != null && "".equals(email) == false){

  map.put("email", email);

  resultList = service.select(map, new HashMap<>()).getResultList();

  }

  else if(phone != null && "".equals(phone) == false){

  map.put("phone", phone);

  resultList = service.select(map, new HashMap<>()).getResultList();

  }else{

  return error(30000, "账号或密码不能为空");

  }

  if (resultList == null || password == null) {

  return error(30000, "账号或密码不能为空");

  }

  //判断是否有这个用户

  if (resultList.size()<=0){

  return error(30000,"用户不存在");

  }

  User byUsername = (User) resultList.get(0);

  Map<String, String> groupMap = new HashMap<>();

  groupMap.put("name",byUsername.getUserGroup());

  List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();

  if (groupList.size()<1){

  return error(30000,"用户组不存在");

  }

  UserGroup userGroup = (UserGroup) groupList.get(0);

  //查询用户审核状态

  if (!StringUtils.isEmpty(userGroup.getSourceTable())){

  String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();

  String res = String.valueOf(service.runCountSql(sql).getSingleResult());

  if (res==null){

  return error(30000,"用户不存在");

  }

  if (!res.equals("已通过")){

  return error(30000,"该用户审核未通过");

  }

  }

  //查询用户状态

  if (byUsername.getState()!=1){

  return error(30000,"用户非可用状态,不能登录");

  }

  String md5password = service.encryption(password);

  if (byUsername.getPassword().equals(md5password)) {

  // 存储Token到数据库

  AccessToken accessToken = new AccessToken();

  accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

  accessToken.setUser_id(byUsername.getUserId());

  tokenService.save(accessToken);

  // 返回用户信息

  JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

  user.put("token", accessToken.getToken());

  JSONObject ret = new JSONObject();

  ret.put("obj",user);

  return success(ret);

  } else {

  return error(30000, "账号或密码不正确");

  }

  }

  用户资料修改模块的实现

  用户登录/注册成功之后可以修改自己的基本信息。修改页面的表单中每一个input的name值都要与实体类中的参数相匹配,在用户点击修改页面的时候,如果改后用户名与数据库里面重复了,页面会提示该用户名已经存在了,否则通过Id来查询用户,并将用户的信息修改为表单提交的数据。

  酒店资讯管理模块的实现

  如果酒店资讯的信息需要修改,管理员可以通过查询酒店资讯的基本信息来查询酒店资讯,查询酒店资讯是通过ajax技术来进行查询的,需要传递酒店资讯的标题、编号等参数然后在返回到该页面中,可以选中要修改或删除的那条信息,如果选中了超过一条数据,页面会挑一个窗口提醒只能选择一条数,如果没有选中数据会挑一个窗口题型必须选择一条数据。当选择确认修改的时候,后台会根据传过来的id到数据库查询,并将结果返回到修改页面中,可以在修改页面中修改刚刚选中的信息当点击确认的时候from表单会将修改的数据提交到后台并保存到数据库中,就是说如果提交的数据数据库中存在就修改,否则就保存。

  酒店资讯展示界面如下图所示。

  

  图5-5酒店资讯展示界面

  酒店资讯管理界面如下图所示。

  

  图5-6酒店资讯管理界面

  酒店资讯发布的关键代码如下。

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  service.insert(service.readBody(request.getReader()));

  return success(1);

  }

  @Transactional

  public Map<String, Object> addMap(Map<String,Object> map){

  service.insert(map);

  return success(1);

  }

  public Map<String,Object> readBody(BufferedReader reader){

  BufferedReader br = null;

  StringBuilder sb = new StringBuilder("");

  try{

  br = reader;

  String str;

  while ((str = br.readLine()) != null){

  sb.append(str);

  }

  br.close();

  String json = sb.toString();

酒店管理专业前景如何

  return JSONObject.parseObject(json, Map.class);

  }catch (IOException e){

  e.printStackTrace();

  }finally{

  if (null != br){

  try{

  br.close();

  }catch (IOException e){

  e.printStackTrace();

  }

  }

  }

  return null;

  }

  public void insert(Map<String,Object> body){

  StringBuffer sql = new StringBuffer("INSERT INTO ");

  sql.append("`").append(table).append("`").append(" (");

  for (Map.Entry<String,Object> entry:body.entrySet()){

  sql.append("`"+humpToLine(entry.getKey())+"`").append(",");

  }

  sql.deleteCharAt(sql.length()-1);

  sql.append(") VALUES (");

  for (Map.Entry<String,Object> entry:body.entrySet()){

  Object value = entry.getValue();

  if (value instanceof String){

  sql.append("'").append(entry.getValue()).append("'").append(",");

  }else {

  sql.append(entry.getValue()).append(",");

  }

  }

  sql.deleteCharAt(sql.length() - 1);

  sql.append(")");

  log.info("[{}] - 插入操作:{}",table,sql);

  Query query = runCountSql(sql.toString());

  query.executeUpdate();

  }

  评论模块的实现

  用户可以发表自己的评论。将页面session中的用户账号userId和发表评论文字框内容传入控制层LiuyanAction,调用addLiuyan方法,通过LiuyanDAOImp向数据库评论表插入,将结果返回lyb.jsp界面。

  评论添加流程图如下图所示。

  

  图5-7评论添加流程图

  评论发表界面如下所示。

  

  图5-8评论发表界面

  预订客房模块的实现

  预订客房功能整体流程:用户浏览客房信息时,同时会显示客房的状态,系统会在其显示详细信息的页面时便会判断客房的状态,若客房状态为可预订,则会显示预订的链接按钮。在用户点击预订按钮时,会先通过拦截器判断用户是否登录,若未登录,会跳转至登录页面,提示用户先登录,若为登录用户就会跳转至填写预订信息的页面,填写好预订信息之后,点击提交按钮,预订成功之后返回提示信息,告知用户预订成功。

  预订客房流程图如下图所示。

  

  图5-9预订客房流程图

北京二外语学院中瑞酒店管理学院-瑞士学习生活-搜狐教育

  预订客房界面如下图所示。

  

  图5-10预订客房界面

  预订管理界面如下图所示。

  

  图5-11预订管理界面

  预订添加关键代码如下。

  @RequestMapping(value = {"/avg_group", "/avg"})

  public Map<String, Object> avg(HttpServletRequest request) {

  Query count = service.avg(service.readQuery(request), service.readConfig(request));

  return success(count.getResultList());

  }

  客房管理模块的实现

  根据需求,需要对客房进行添加、删除或修改详情信息。删除或修改客房时,系统根据客房的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询客房状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。

  添加客房时,会给出数据填写的页面,该页面根据填写好的客房编号同样会事先发送Ajax请求查询编号是否已存在,数据填写好之后提交到后台,会调用相关服务在数据库中插入记录。

  客房管理流程图如下图所示。

  

  图5-20客房管理流程图

  客房添加页面设计效果如下图所示。

  

  图5-21客房添加界面

  客房管理页面效果如下图所示。

  

  图5-22客房管理界面

  客房发布的关键代码如下。

酒店管理大堂经理

  @RestController

  @RequestMapping("auth")

  public class AuthController extends BaseController<Auth, AuthService> {

  /**

  * 服务对象

  */

  @Autowired

  public AuthController(AuthService service) {

  setService(service);

  }

  }