El comercio electrónico se ha consolidado como un pilar fundamental para la distribución de productos con identidad local. Para impulsar la comercialización de las especialidades culinarias de la región de Hunan, se ha diseñado e implementado una aplicación web completa. Esta solución digital integra un catálogo de productos, un flujo de compra seguro y herramientas administrativas para vendedores, facilitando así el acceso de consumidores a nivel nacional a estos productos tradicionales.
La arquitectura técnica de la plataforma se basa en un enfoque de separación entre el frontend y el backend. El lado del servidor está construido con el framework Spring Boot 2, que proporciona una base sólida para la lógica de negocio y la gestión de peticiones HTTP. La persistencia de datos se maneja mediante MyBatis-Plus, el cual simplifica las operaciones CRUD y la generación de consultas SQL dinámicas. Para el almacenamiento, se utiliza MySQL 8.0, elegido por su robustez y compatibilidad con los componentes del sistema. El frontend, desarrollado con Vue 3, ofrece una interfaz de usuario reactiva y modular, mejorando significativamente la experiencia de navegación.
Las funcionalidades principales del sistema están organizadas en módulos diferenciados. Incluye la gestión de cuentas de usuario, el listado y detalle de productos, un sistema de carrito de compras, el procesamiento de pedidos y una consola administrativa para el control del inventario y los roles de acceso.
Esquema de la Base de Datos
La estructura del almacenamiento de datos se define en las siguientes tablas principales.
Tabla de Usuarios
Almacena la información de los clientes registrados. El campo registration_time se asigna automáticamente al crear el registro.
| Columna | Tipo de Dato | Descripción |
|---|---|---|
uid |
BIGINT | Identificador único del usuario (Clave Primaria) |
login_name |
VARCHAR(50) | Nombre de usuario para el inicio de sesión (Único) |
pwd_hash |
VARCHAR(100) | Contraseña encriptada |
contact_email |
VARCHAR(100) | Correo electrónico de contacto |
mobile_phone |
VARCHAR(20) | Número de teléfono móvil |
created_at |
DATETIME | Fecha y hora de registro |
is_active |
TINYINT | Estado de la cuenta (0 - Inactivo, 1 - Activo) |
Tabla de Productos
Contiene los detalles de cada artículo a la venta. El listing_date se establece mediante una función de la base de datos.
| Columna | Tipo de Dato | Descripción |
|---|---|---|
prod_id |
BIGINT | Identificador único del producto (Clave Primaria) |
name |
VARCHAR(100) | Nombre descriptivo del producto |
category_name |
VARCHAR(50) | Categoría a la que pertenece |
unit_price |
DECIMAL(10,2) | Precio de venta por unidad |
available_qty |
INT | Cantidad disponible en inventario |
details |
TEXT | Descripción detallada del producto |
listed_at |
DATETIME | Fecha de publicación en el catálogo |
is_published |
TINYINT | Estado de publicación (0 - Oculto, 1 - Visible) |
Tabla de Pedidos
Registra las transacciones de compra realizadas por los usuarios.
| Columna | Tipo de Dato | Descripción |
|---|---|---|
order_id |
BIGINT | Número de pedido único (Clave Primaria) |
buyer_id |
BIGINT | ID del usuario que realizó la compra (Clave Foránea) |
product_id |
BIGINT | ID del producto comprado (Clave Foránea) |
items_qty |
INT | Cantidad de unidades adquiridas |
total_cost |
DECIMAL(10,2) | Monto total del pedido |
purchased_at |
DATETIME | Fecha y hora de la compra |
payment_confirmed |
TINYINT | Estado del pago (0 - Pendiente, 1 - Confirmado) |
delivery_address |
VARCHAR(200) | Dirección para el envío del pedido |
Fragmantos de Código del Backend
A continuación se muestra la clase de arranque principal de la aplicación Spring Boot y un ejemplo de un controlador REST para la gestión de usuarios.
package com.platform;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan("com.platform.repository")
public class ApplicationBoot extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ApplicationBoot.class, args);
}
}
package com.platform.web.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.platform.model.UserAccount;
import com.platform.service.UserAccountService;
import com.platform.utils.ApiResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserProfileController {
private final UserAccountService userService;
@Autowired
public UserProfileController(UserAccountService service) {
this.userService = service;
}
// Endpoint para la autenticación del usuario
@PostMapping("/authenticate")
public ApiResponse authenticateUser(@RequestParam String account, @RequestParam String secret) {
QueryWrapper<UserAccount> query = new QueryWrapper<>();
query.eq("login_name", account);
UserAccount user = userService.getOne(query);
if (user == null || !user.getPwdHash().equals(secret)) {
return ApiResponse.error("Credenciales inválidas");
}
// Lógica para generar y devolver un token de sesión...
return ApiResponse.success("Autenticación exitosa");
}
// Endpoint para crear una nueva cuenta
@PostMapping("/create")
public ApiResponse registerNewUser(@RequestBody UserAccount newUser) {
boolean exists = userService.checkUsernameAvailability(newUser.getLoginName());
if (!exists) {
return ApiResponse.error("El nombre de usuario ya está registrado");
}
userService.registerUser(newUser);
return ApiResponse.success("Registro completado");
}
// Endpoint para actualizar datos del perfil
@PutMapping("/update/{id}")
public ApiResponse modifyUser(@PathVariable Long id, @RequestBody UserAccount updatedData) {
updatedData.setUid(id);
userService.updateUserDetails(updatedData);
return ApiResponse.success("Perfil actualizado");
}
}