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');