Plataforma de Venta de Especialidades Regionales con Spring Boot y Vue.js

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");
    }
}

Etiquetas: Spring Boot vue.js MyBatis-Plus MySQL Java Web

Publicado el 6-2 17:57