Desarrollo de un Sistema de Gestión de Alojamiento en Hoteles Basado en Web con Python

El backend del sistema se desarrolla con Python y el framework Django para garantizar la seguridad y fluidez de los datos de gestión de habitaciones. Se utiliza MySQL para almacenar datos de habitaciones (tipo, precio, instalaciones, estado en tiempo real), reservas (información del cliente, fechas de entrada y salida, estado de la orden) y clientes (información de identidad, historial de estancia, preferencias). Redis se emplea para el almacenamiento en caché de estados de habitaciones en tiempo real, tipos de habitaciones populares y órdenes pendientes, lo que alivia la presión del sistema durante la temporada alta y mejora la velocidad de respuesta. Las funcionalidades incluyen reserva en línea, actualización automática del estado de las habitaciones y procesamiento rápido de check-in/check-out, facilitando la verificación rápida de la información del cliente y optimizando los flujos de trabajo del hotel.

Los módulos principales son: gestión de habitaciones, que mantiene la información de las habitaciones y actualiza su estado en tiempo real; gestión de reservas, que permite reservas en línea y seguimiento del estado de las órdenes; gestión de clientes, que establece perfiles de clientes y registra sus preferencias; y gestión de check-in/check-out, que simplifica los procesos y genera facturas automáticamente.

Introducción a la Desarrollo

  • Framework de Python: Django
  • Versión de software: Python 3.7/3.8
  • Base de datos: MySQL 5.7 o superior (teóricamente, versiones 5.X debería funcionar)
  • Herramienta de base de datos: Navicat 11 (recomendado)
  • Software de deesarrollo: PyCharm/vs code
  • Framework frontend: Vue.js

Pruebas del Sistema

La prueba del sistema tiene como objetivo principal encontrar y corregir defectos, asegurando que cumpla con las necesidades del usuario. Se realizan pruebas funcionales para validar cada módulo, como la autenticación de usuarios y la gestión de clientes. Los resultados de las pruebas muestran que el sistema mejora significativamente la eficiencia de las operaciones del hotel, reduciendo tiempos de procesamiento y mejorando la experiencia del usuario.

Ejemplo de Código

```

  @IgnoreAuth
  @PostMapping(value = "/login")
  public R login(@RequestParam String username, @RequestParam String password, @RequestParam String captcha, HttpServletRequest request) {
    UsersEntity user = userService.selectOne(new EntityWrapper<usersentity>().eq("username", username));
    if (user == null || !user.getPassword().equals(password)) {
      return R.error("Credenciales incorrectas");
    }
    String token = tokenService.generateToken(user.getId(), username, "users", user.getRole());
    return R.ok().put("token", token);
  }

  @Override
  public String generateToken(Long userId, String username, String tableName, String role) {
    TokenEntity tokenEntity = this.selectOne(new EntityWrapper<tokenentity>().eq("userid", userId).eq("role", role));
    String token = CommonUtil.getRandomString(32);
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.HOUR_OF_DAY, 1);
    if (tokenEntity != null) {
      tokenEntity.setToken(token);
      tokenEntity.setExpiratedtime(cal.getTime());
      this.updateById(tokenEntity);
    } else {
      this.insert(new TokenEntity(userId, username, tableName, role, token, cal.getTime()));
    }
    return token;
  }

  @Component
  public class AuthorizationInterceptor implements HandlerInterceptor {
    public static final String LOGIN_TOKEN_KEY = "Token";

    @Autowired
    private TokenService tokenService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader("Access-Control-Allow-Credentials", "true");
      response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
      response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
      if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
        response.setStatus(HttpStatus.OK.value());
        return false;
      }

      IgnoreAuth annotation;
      if (handler instanceof HandlerMethod) {
        annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
      } else {
        return true;
      }

      String token = request.getHeader(LOGIN_TOKEN_KEY);
      if (annotation != null) {
        return true;
      }

      TokenEntity tokenEntity = null;
      if (StringUtils.isNotBlank(token)) {
        tokenEntity = tokenService.getTokenEntity(token);
      }

      if (tokenEntity != null) {
        request.getSession().setAttribute("userId", tokenEntity.getUserid());
        request.getSession().setAttribute("role", tokenEntity.getRole());
        request.getSession().setAttribute("tableName", tokenEntity.getTablename());
        request.getSession().setAttribute("username", tokenEntity.getUsername());
        return true;
      }

      PrintWriter writer = null;
      response.setCharacterEncoding("UTF-8");
      response.setContentType("application/json; charset=utf-8");
      try {
        writer = response.getWriter();
        writer.print(JSONObject.toJSONString(R.error(401, "Por favor, inicia sesión")));
      } finally {
        if (writer != null) {
          writer.close();
        }
      }
      return false;
    }
  }
</tokenentity></usersentity>
  

 
    ```

      -- Estructura de la tabla token
      DROP TABLE IF EXISTS `token`;
      CREATE TABLE `token` (
        `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
        `userid` bigint(20) NOT NULL COMMENT 'ID de usuario',
        `username` varchar(100) NOT NULL COMMENT 'Nombre de usuario',
        `tablename` varchar(100) DEFAULT NULL COMMENT 'Nombre de la tabla',
        `role` varchar(100) DEFAULT NULL COMMENT 'Rol',
        `token` varchar(200) NOT NULL COMMENT 'Token',
        `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Tiempo de adición',
        `expiratedtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Tiempo de expiración',
        PRIMARY KEY (`id`) USING BTREE
      ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='Tabla de tokens';

      -- Registros de la tabla token
      INSERT INTO `token` VALUES ('9', '23', 'cd01', 'xuesheng', 'Estudiante', 'al6svx5qkei1wljry5o1npswhdpqcpcg', '2023-02-23 21:46:45', '2023-03-15 14:01:36');
      INSERT INTO `token` VALUES ('10', '11', 'xh01', 'xuesheng', 'Estudiante', 'fahmrd9bkhqy04sq0fzrl4h9m86cu6kx', '2023-02-27 18:33:52', '2023-03-17 18:27:42');
      INSERT INTO `token` VALUES ('11', '17', 'ch01', 'xuesheng', 'Estudiante', 'u5km44scxvzuv5yumdah2lhva0gp4393', '2023-02-27 18:46:19', '2023-02-27 19:48:58');
      INSERT INTO `token` VALUES ('12', '1', 'admin', 'users', 'Administrador', 'h1pqzsb9bldh93m92j9m2sljy9bt1wdh', '2023-02-27 19:37:01', '2023-03-17 18:23:02');
      INSERT INTO `token` VALUES ('13', '21', 'xiaohao', 'shezhang', 'Presidente', 'zdm7j8h1wnfe27pkxyiuzvxxy27ykl2a', '2023-02-27 19:38:07', '2023-03-17 18:25:20');
      INSERT INTO `token` VALUES ('14', '27', 'djy01', 'xuesheng', 'Estudiante', 'g3teq4335pe21nwuwj2sqkrpqoabqomm', '2023-03-15 12:56:17', '2023-03-15 14:00:16');
      INSERT INTO `token` VALUES ('15', '29', 'dajiyue', 'shezhang', 'Presidente', '0vb1x9xn7riewlp5ddma5ro7lp4u8m9j', '2023-03-15 12:58:08', '2023-03-15 14:03:48');
    

Etiquetas: Python Django MySQL Redis vue.js

Publicado el 10-20 16:23