当前位置:   article > 正文

数据库应用实践大作业:数据库应用系统的开发_数据库设计与应用开发大作业

数据库设计与应用开发大作业

数据库实践大作业展示——基于springboot+vue的水产品贸易中心数据库应用系统开发

前言

这是一个基于springboot+vue实现的数据库应用系统,因为是独立开发也没有去网上找现成的模板,所以截止上周实践汇报,这个项目的完成度就是所有表在前端的增删改查(包括模糊匹配查询),以及部分表通过触发器进行表间数据的联动(没评到最好的一档,次一档)。

如果需要完善改进的话,可以从用户权限、登录注册、数据加密、缓存加载等方面着手,在这几块完善一下会有更好的效果,发出来就当是记录一下自己也投入了一段时间和精力的作品吧。

实验环境:Windows10,MySQL8.0.35,IDEA2023.2.5, DBeaver

目录

数据库应用实践大作业:数据库应用系统的开发

前言

实验内容:

一、 系统选题需求情况及任务分工情况说明

二、 系统的概念数据模型(E-R 图)设计

三、 系统中每张表的说明

供应商表

产品表

库存表

进货关系表

销售记录表

订单表

订单销售记录关系表

订单供应商关系表

客户表

签订关系表

运货司机表

配送关系表

视图一:销售记录及产品信息视图

视图二:订单及客户信息视图

存储过程一:计算客户的累计购买金额

存储过程二:更新订单状态并触发配送操作

存储过程三:处理订单的签收操作

四、 系统运行环境配置,安装操作说明,前端与后台数据库连接用到的关键语句说明

安装操作说明:

1.进入项目

2.配置依赖

3.连接数据库

4.启动后端

5.启动前端

五、 系统主要功能界面介绍(需使用截图)

1.客户信息管理:

2.供应商信息管理:

3.水产品信息管理

4.库存信息管理

5.入库记录管理

6.销售记录管理

7.订单记录管理

8.订单销售记录关系管理

9.订单供应商关系管理

10.签订关系管理

11.运货司机管理

12.运货记录管理

六、 实验结果总结:(分析系统运行效果,说明系统优缺点及改进方向)

七、 编程工作总结:


实验内容:

一、 系统选题需求情况及任务分工情况说明

我的选题内容是:在实验一的基础上,完善并实现一个水产贸易中心的数据库应用系统开发。

实现水产贸易中心水产品入库、库存批次管理、销售管理、配送管理、供货溯源等流程的功能。

不进行团队合作,单人开发。

二、 系统的概念数据模型(E-R 图)设计

这是在数据库设计阶段我绘制的E-R图:

关系模式如下:

供应商(供应商编号,商家名称,商家特色简介,商家地址,联系人,联系方式,热度)

产品(产品编号,供应商编号,产品名称,产品描述,产地)

库存(产品编号,批次号,库存数量,储存位置)

进货关系(产品编号,批次号,供应商编号,进货单价,入库日期)

销售记录(销售记录编号,售出单价,销售数量,产品编号,批次号)

订单(订单编号,订单总金额,实付金额,订单状态,发货日期)

订单销售记录关系(销售记录编号,订单编号,单品利润)

订单供应商关系(订单编号,供应商编号,商品权重)

客户(客户编号,客户名称,默认地址,联系人,联系方式,购买次数,总交易额)

签订关系(订单编号,客户编号,折扣倍率,下单日期)

运货司机(司机编号,车辆编号,司机姓名,联系方式)

配送关系(订单编号,司机编号,配送状态,配送费用,配送地点,预计送达时间)

其中包含一些属性不够多的1对n关系,这部分关系在实现中没有变成基本表而是作为外键存在(比如出货关系,一个库存对应多个销售记录,故在销售记录表添加产品编号批次号属性作为外键。)

以下是实现后在数据库中查看到的E-R图:

三、 系统中每张表的说明

供应商表

供应商编号自增,供应商名至少为4个字且不能重复不能为空;商家描述至少为6个字,不能为空;地址至少为6个字,不能为空;联系方式不能为空;创建供应商名的全文索引,添加一个热度属性(数据类型为DECIMAL(10, 2),初始值为0)与热度属性的索引。通过建立插入前的触发器的方式来检测插入的数据是否合法。

-- 创建供应商表 
 CREATE TABLE Supplier ( 
   supplierId INT PRIMARY KEY AUTO_INCREMENT, 
   merchantName VARCHAR(50) NOT NULL UNIQUE CHECK (LENGTH(merchantName) >= 4), 
   merchantDescription VARCHAR(100) NOT NULL CHECK (LENGTH(merchantDescription) >= 6), 
   merchantAddress VARCHAR(100) NOT NULL CHECK (LENGTH(merchantAddress) >= 6), 
   contactPerson VARCHAR(20) NOT NULL, 
   contactNumber VARCHAR(30) NOT NULL, 
   popularity DECIMAL(10, 2) DEFAULT 0, 
   FULLTEXT INDEX idx_merchantName (merchantName), 
   INDEX idx_popularity (popularity) 
 ); 
 
 -- 创建插入前触发器,用于检测插入的数据是否合法 
 DELIMITER // 
 CREATE TRIGGER before_supplier_insert 
 BEFORE INSERT ON Supplier 
 FOR EACH ROW 
 BEGIN 
   IF (LENGTH(NEW.merchantName) < 4 OR LENGTH(NEW.merchantDescription) < 6 OR LENGTH(NEW.merchantAddress) < 6) THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '商户名不得少于4字符,描述不得少于6字符,地址不得少于6字符,再检查检查吧~'; 
   END IF; 
 END // 
 DELIMITER ;

产品表

产品编号自增,添加产品名的全文索引,产品名不得少于4个字;产品描述不得少于6个字;产地不得少于2个字。

-- 创建产品表
CREATE TABLE Product (
    productId INT PRIMARY KEY AUTO_INCREMENT,
    supplierId INT,
    productName VARCHAR(50) NOT NULL CHECK (LENGTH(productName) >= 4),
    productDescription VARCHAR(100) NOT NULL CHECK (LENGTH(productDescription) >= 6),
    origin VARCHAR(50) NOT NULL CHECK (LENGTH(origin) >= 2),
    FOREIGN KEY (supplierId) REFERENCES Supplier(supplierId),
    FULLTEXT INDEX idx_productName (productName)
);

库存表

库存数使用约束条件 CHECK (stockQuantity >= 0)来确保不小于0,存储位置使用约束条件 CHECK (LENGTH(storageLocation) >= 6)来确保不少于6个字。另外,产品编号 productId设置为外键,关联到产品表的 productId 字段,通过 FOREIGN KEY (productId) REFERENCES Product(productId) 来建立关联关系。

-- 创建库存表
CREATE TABLE Inventory (
    productId INT,
    batchNumber INT,
    stockQuantity INT CHECK (stockQuantity >= 0),
    storageLocation VARCHAR(100) CHECK (LENGTH(storageLocation) >= 6),
    PRIMARY KEY (productId, batchNumber),
    FOREIGN KEY (productId) REFERENCES Product(productId)
);

进货关系

进价不得为负,插入数据如果没有指定inputDate则默认当前时间。

实现一个触发器,在插入进货关系后,如果没有相同的主码productId和batchNumber,则向库存表添加一条库存记录,设置库存量为进货数量, storageLocation为“位置尚未分配”;如果有相同的主码的记录了,就更新原本的stockQuantity加上进货数量。

-- 创建进货关系表
CREATE TABLE PurchaseRelation (
    productId INT,
    batchNumber INT,
    supplierId INT,
    purchasePrice DECIMAL(10, 2) CHECK (purchasePrice >= 0),
    purchaseQuantity INT CHECK (purchaseQuantity >= 0),
    inputDate DATETIME DEFAULT NOW(),
    PRIMARY KEY (productId, batchNumber),
    FOREIGN KEY (productId) REFERENCES Product(productId),
    FOREIGN KEY (supplierId) REFERENCES Supplier(supplierId)
);
​
-- 创建触发器
DELIMITER $$
CREATE TRIGGER update_inventory_trigger
AFTER INSERT ON PurchaseRelation
FOR EACH ROW
BEGIN
    -- 检查库存表是否已存在相同的主码记录
    IF EXISTS (
        SELECT 1
        FROM Inventory
        WHERE productId = NEW.productId AND batchNumber = NEW.batchNumber
    ) THEN
        -- 更新库存表中对应记录的stockQuantity
        UPDATE Inventory
        SET stockQuantity = stockQuantity + NEW.purchaseQuantity
        WHERE productId = NEW.productId AND batchNumber = NEW.batchNumber;
    ELSE
        -- 添加新的库存记录
        INSERT INTO Inventory (productId, batchNumber, stockQuantity, storageLocation)
        VALUES (NEW.productId, NEW.batchNumber, NEW.purchaseQuantity, '位置尚未分配');
    END IF;
END$$
DELIMITER ;

销售记录表

去掉出货关系表,将productId和 batchNumber两个外键直接加入销售记录表中;售出单价不得为负;创建一个触发器,在插入销售记录前,根据productId和batchNumber找到库存表中的对应库存记录,检查库存数量是否大于等于售出数量,如果满足则插入成功并更新库存数量(库存数量减去售出数量),不满足返回“对应水产数量不足”。

-- 创建销售记录表
CREATE TABLE SalesRecord (
    salesRecordId INT PRIMARY KEY,
    unitPrice DECIMAL(10, 2) CHECK (unitPrice >= 0),
    quantity INT CHECK (quantity >= 0),
    productId INT,
    batchNumber INT,
    FOREIGN KEY (productId, batchNumber) REFERENCES Inventory(productId, batchNumber)
);
-- 创建触发器
DELIMITER $$
CREATE TRIGGER before_insert_SalesRecord_trigger
BEFORE INSERT ON SalesRecord
FOR EACH ROW
BEGIN
    DECLARE inventoryQty INT;
​
    -- 获取库存数量
    SELECT stockQuantity INTO inventoryQty
    FROM Inventory
    WHERE productId = NEW.productId AND batchNumber = NEW.batchNumber;
​
    -- 检查库存数量是否足够
    IF inventoryQty >= NEW.quantity THEN
        -- 更新库存数量
        UPDATE Inventory
        SET stockQuantity = stockQuantity - NEW.quantity
        WHERE productId = NEW.productId AND batchNumber = NEW.batchNumber;
    ELSE
        -- 抛出异常
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '对应水产数量不足';
    END IF;
END$$
DELIMITER ;

订单表

订单表的总金额不能为负,初始值为0,orderStatus改为枚举类型(“待付款、待发货、待收货、已完成”)

-- 创建订单表
CREATE TABLE Orders (
    orderId INT PRIMARY KEY AUTO_INCREMENT,
    totalAmount DECIMAL(10, 2) DEFAULT 0 CHECK (totalAmount >= 0),
    amountPaid DECIMAL(10, 2),
    orderStatus ENUM('待付款', '待发货', '待收货', '已完成'),
    deliveryDate DATETIME
);

订单销售记录关系表

在订单销售记录关系表中增加两个触发器:

1.向订单销售记录关系表插入数据前,根据销售记录编号查询对应销售记录的售出单价和售出数量,再根据对应销售记录的产品编号和批次号查询到进货关系表中的进货单价,用售出单价减进货单价,再乘上售出数量,得到单品利润。

2.在插入数据后,根据根据销售记录编号查询对应销售记录的售出单价和售出数量,相乘后根据订单编号更新对应订单记录的总金额(原总金额加上售出单价和售出数量的相乘结果)。

-- 创建订单销售记录关系表
CREATE TABLE OrderSalesRecordRelation (
    salesRecordId INT,
    orderId INT,
    itemProfit DECIMAL(10, 2),
    PRIMARY KEY (salesRecordId),
    FOREIGN KEY (salesRecordId) REFERENCES SalesRecord(salesRecordId),
    FOREIGN KEY (orderId) REFERENCES Orders(orderId)
);
​
DELIMITER $$
-- 创建触发器1:计算单品利润
CREATE TRIGGER calculateItemProfit
BEFORE INSERT ON OrderSalesRecordRelation
FOR EACH ROW
BEGIN
    DECLARE sellingPrice DECIMAL(10, 2);
    DECLARE sellingQuantity INT;
    DECLARE purchasePrice DECIMAL(10, 2);
    
    SELECT unitPrice, quantity INTO sellingPrice, sellingQuantity
    FROM SalesRecord
    WHERE salesRecordId = NEW.salesRecordId;
    
    SELECT purchasePrice INTO purchasePrice
    FROM PurchaseRelation
    WHERE productId = (SELECT productId FROM SalesRecord WHERE salesRecordId = NEW.salesRecordId)
    AND batchNumber = (SELECT batchNumber FROM SalesRecord WHERE salesRecordId = NEW.salesRecordId);
    
    SET NEW.itemProfit = (sellingPrice - purchasePrice) * sellingQuantity;
END$$
DELIMITER ;
​
DELIMITER $$
-- 创建触发器2:更新订单总金额
CREATE TRIGGER updateTotalAmount
AFTER INSERT ON OrderSalesRecordRelation
FOR EACH ROW
BEGIN
    DECLARE sellingPrice DECIMAL(10, 2);
    DECLARE sellingQuantity INT;
    
    SELECT unitPrice, quantity INTO sellingPrice, sellingQuantity
    FROM SalesRecord
    WHERE salesRecordId = NEW.salesRecordId;
    
    UPDATE Orders
    SET totalAmount = totalAmount + (sellingPrice * sellingQuantity)
    WHERE orderId = NEW.orderId;
END$$
DELIMITER ;

订单供应商关系表

增加两个触发器:

1.向订单供应商关系表插入数据前,根据订单编号查询订单销售记录表该订单关联的所有销售记录编号,根据这些销售记录编号查询对应销售记录的产品编号,再根据产品编号查询产品表中对应产品的供应商编号,选出与该条订单供应商关系记录的供应商编号相同的销售记录,将他们的单品利润相加作为被除数,除以该订单关联的所有销售记录编号对应单品利润的总和,得到该条订单供应商关系记录的productWeight值。该订单关联的所有销售记录编号对应产品的供应商编号均为该条订单供应商关系记录的供应商编号,则权重值设为1,无需进行除法计算。

2.插入数据后,更新供应商表中对应供应商的popularity热度值。

-- 创建订单供应商关系表
CREATE TABLE OrderSupplierRelation (
    orderId INT,
    supplierId INT,
    productWeight INT DEFAULT 0,
    PRIMARY KEY (orderId,supplierId),
    FOREIGN KEY (orderId) REFERENCES Orders(orderId) ON DELETE CASCADE,
    FOREIGN KEY (supplierId) REFERENCES Supplier(supplierId) ON DELETE CASCADE
);
-- 创建触发器:计算权重值和更新供应商表中的popularity值
DELIMITER //
CREATE TRIGGER calculateProductWeight
BEFORE INSERT ON OrderSupplierRelation
FOR EACH ROW
BEGIN
    DECLARE totalItemProfit DECIMAL(10, 2);
    DECLARE totalProductWeight DECIMAL(10, 2);
    DECLARE supplierId INT;
    DECLARE cur_salesRecordId INT;
    DECLARE cur_productId INT;
    DECLARE cur_itemProfit DECIMAL(10, 2);
    
    SET supplierId = NEW.supplierId;
    SET totalItemProfit = 0;
    SET totalProductWeight = 0;
    
    -- 获取订单关联的销售记录编号
    BEGIN
        DECLARE cur_salesRecordIds CURSOR FOR
        SELECT salesRecordId
        FROM OrderSalesRecordRelation
        WHERE orderId = NEW.orderId;
        
        -- 遍历销售记录
        OPEN cur_salesRecordIds;
        loop_salesRecordIds: LOOP
            FETCH cur_salesRecordIds INTO cur_salesRecordId;
            
            -- 根据销售记录编号查询产品编号
            SET cur_productId = (SELECT productId FROM SalesRecord WHERE salesRecordId = cur_salesRecordId);
            
            -- 查询产品对应的供应商编号
            SET cur_itemProfit = (SELECT itemProfit FROM OrderSalesRecordRelation WHERE salesRecordId = cur_salesRecordId);
            
            -- 计算总单品利润
            SET totalItemProfit = totalItemProfit + cur_itemProfit;
            
            -- 如果与订单供应商关系记录的供应商编号相同的销售记录存在,则进行除法计算
            IF EXISTS (
                SELECT 1 FROM SalesRecord
                INNER JOIN Product ON SalesRecord.productId = Product.productId
                WHERE SalesRecord.salesRecordId = cur_salesRecordId
                AND Product.supplierId = supplierId
            ) THEN
                SET totalProductWeight = totalProductWeight + cur_itemProfit;
            END IF;
        END LOOP loop_salesRecordIds;
        CLOSE cur_salesRecordIds;
    END;
    
    -- 如果所有销售记录对应的产品供应商编号均为该条订单供应商关系记录的供应商编号,则权重值设为1
    IF totalProductWeight = totalItemProfit THEN
        SET NEW.productWeight = 1;
    ELSE
        SET NEW.productWeight = totalProductWeight / totalItemProfit;
    END IF;
    
END; //
DELIMITER ;
​
-- 创建触发器:更新供应商表中的popularity值
DELIMITER //
CREATE TRIGGER updateSupplierPopularity
AFTER INSERT ON OrderSupplierRelation
FOR EACH ROW
BEGIN
    UPDATE Supplier
    SET popularity = popularity + NEW.productWeight
    WHERE supplierId = NEW.supplierId;
END; //
DELIMITER ;

客户表

客户名不为空,交易次数purchaseCount 和总交易额totalRevenue初始为0

-- 创建客户表
CREATE TABLE Customer (
    customerId INT PRIMARY KEY,
    customerName VARCHAR(50),
    defaultAddress VARCHAR(100),
    contactPerson VARCHAR(50),
    contactNumber VARCHAR(20),
    purchaseCount INT,
    totalRevenue DECIMAL(10, 2)
);

签订关系表

增加2个触发器:

1.插入签订关系前,如果客户表中对应客户编号的客户的购买次数为0,则设置订单表中对应订单编号的订单记录的折扣率为0.95,如果对应客户总交易额超过1000,也设置折扣率为0.95,如果对应客户总交易额超过10000,则设置折扣率为0.9,如果符合多个条件,折扣率只取其中最低的设置值。

2.插入签订关系后,更新订单表中对应订单编号的订单记录的实付款amountPaid( totalAmount 乘上折扣率),更新对应客户的购买次数(加1)和总交易额(原值加上当前对应订单的amountPaid值)。

-- 创建签订关系表
CREATE TABLE SigningRelation (
    orderId INT,
    customerId INT,
    discountRate DECIMAL(4, 2),
    orderDate DATETIME,
    PRIMARY KEY (orderId,customerId),
    FOREIGN KEY (orderId) REFERENCES Orders(orderId) ON DELETE CASCADE,
    FOREIGN KEY (customerId) REFERENCES Customer(customerId) ON DELETE CASCADE
);
-- 创建触发器
DELIMITER //
CREATE TRIGGER before_signing_insert
    BEFORE INSERT ON SigningRelation
    FOR EACH ROW
BEGIN
    DECLARE customerPurchaseCount INT;
    DECLARE customerTotalRevenue DECIMAL(10, 2);

    SELECT purchaseCount, totalRevenue
    INTO customerPurchaseCount, customerTotalRevenue
    FROM Customer
    WHERE customerId = NEW.customerId;

    IF customerPurchaseCount = 0 OR customerTotalRevenue > 10000 THEN
        SET NEW.discountRate = 0.9;
    ELSEIF customerTotalRevenue > 1000 THEN
        SET NEW.discountRate = 0.95;
    ELSE
        SET NEW.discountRate = 1.0;
    END IF;
END //

CREATE TRIGGER after_signing_insert
    AFTER INSERT ON SigningRelation
    FOR EACH ROW
BEGIN
    DECLARE orderTotalAmount DECIMAL(10, 2);
    DECLARE orderAmountPaid DECIMAL(10, 2);
    DECLARE customerPurchaseCount INT;
    DECLARE customerTotalRevenue DECIMAL(10, 2);

    SELECT totalAmount
    INTO orderTotalAmount
    FROM Orders
    WHERE orderId = NEW.orderId;

    SET orderAmountPaid = orderTotalAmount * NEW.discountRate;

    UPDATE Orders
    SET amountPaid = orderAmountPaid
    WHERE orderId = NEW.orderId;

    SELECT purchaseCount, totalRevenue
    INTO customerPurchaseCount, customerTotalRevenue
    FROM Customer
    WHERE customerId = NEW.customerId;

    UPDATE Customer
    SET purchaseCount = customerPurchaseCount + 1,
        totalRevenue = customerTotalRevenue + orderAmountPaid
    WHERE customerId = NEW.customerId;
END //
DELIMITER ;

运货司机表

司机名不为空,最少为2个字

-- 创建运货司机表
CREATE TABLE DeliveryDriver (
    driverId INT PRIMARY KEY,
    vehicleId INT,
    driverName VARCHAR(20),
    contactNumber VARCHAR(20)
);

配送关系表

配送状态改为枚举类型(“配送中”,“待签收”,“已签收”)。

增加一个触发器,当配送状态更新为“已签收”时,更新订单表中对应订单的订单状态为“已完成”。

-- 创建配送关系表
CREATE TABLE DeliveryRelation (
    orderId INT,
    driverId INT,
    deliveryStatus ENUM('配送中', '待签收', '已签收'),
    deliveryFee DECIMAL(10, 2),
    deliveryLocation VARCHAR(100),
    estimatedDeliveryTime DATETIME,
    PRIMARY KEY (orderId),
    FOREIGN KEY (orderId) REFERENCES Orders(orderId),
    FOREIGN KEY (driverId) REFERENCES DeliveryDriver(driverId),
    CONSTRAINT FK_DeliveryRelation_Orders_OrderId FOREIGN KEY (orderId) REFERENCES Orders(orderId)
    ON UPDATE CASCADE
    ON DELETE CASCADE
);
-- 创建触发器
DELIMITER $$
CREATE TRIGGER UpdateOrderStatus
AFTER UPDATE ON DeliveryRelation
FOR EACH ROW
BEGIN
    IF NEW.deliveryStatus = '已签收' THEN
        UPDATE Orders SET orderStatus = '已完成' WHERE orderId = NEW.orderId;
    END IF;
END $$
DELIMITER ;

视图一:销售记录及产品信息视图

这个视图连接销售记录表(SalesRecord)和产品表(Product),以展示销售记录的详细产品信息。

CREATE VIEW SalesProductView AS
SELECT sr.salesRecordId, sr.unitPrice, sr.quantity, p.productName, p.productDescription, p.origin
FROM SalesRecord sr
JOIN Inventory i ON sr.productId = i.productId AND sr.batchNumber = i.batchNumber
JOIN Product p ON i.productId = p.productId;

视图二:订单及客户信息视图

这个视图连接订单表(Orders)和客户表(Customer),以展示订单的相关客户信息。

CREATE VIEW OrderCustomerView AS
SELECT o.orderId, o.totalAmount, o.amountPaid, o.orderStatus, o.deliveryDate, c.customerName, c.defaultAddress, c.contactPerson, c.contactNumber
FROM Orders o
JOIN SigningRelation s ON o.orderId = s.orderId
JOIN Customer c ON s.customerId = c.customerId;

存储过程一:计算客户的累计购买金额

这个存储过程可以计算指定客户的累计购买金额,并将结果存储在客户表中。

DELIMITER //
CREATE PROCEDURE CalculateCustomerTotalRevenue (IN customerID INT)
BEGIN
    DECLARE totalAmount DECIMAL(10, 2);
    SELECT SUM(s.unitPrice * s.quantity) INTO totalAmount
    FROM SalesRecord s
    JOIN OrderSalesRecordRelation osr ON s.salesRecordId = osr.salesRecordId
    JOIN Orders o ON osr.orderId = o.orderId
    WHERE o.orderStatus = '已完成' AND osr.customerId = customerID;

    UPDATE Customer SET totalRevenue = totalAmount WHERE customerId = customerID;
END //
DELIMITER ;

存储过程二:更新订单状态并触发配送操作

这个存储过程可以更新订单状态,并在订单状态变为“待发货”时触发相应的配送操作。

DELIMITER //
CREATE PROCEDURE UpdateOrderStatusAndTriggerDelivery (IN orderID INT)
BEGIN
    UPDATE Orders SET orderStatus = '待发货' WHERE orderId = orderID;
    -- 在此添加触发配送的逻辑,例如调用相应的配送存储过程
END //
DELIMITER ;

存储过程三:处理订单的签收操作

DELIMITER //
CREATE PROCEDURE HandleOrderReceived (IN orderID INT)
BEGIN
    UPDATE Orders SET orderStatus = '已完成' WHERE orderId = orderID;
    -- 在此添加处理签收操作的逻辑,例如更新库存、更新销售记录等
END //
DELIMITER ;

四、 系统运行环境配置,安装操作说明,前端与后台数据库连接用到的关键语句说明

运行环境配置需要JDK17,Node.js18.18.0版本(用于执行npm指令)和maven3.9(我是这个版本的,可能更早一点的maven版本也可以)。

安装操作说明:

1.进入项目

在解压我的项目后,启动IDEA打开102101520_DBMS文件夹:

2.配置依赖

如果项目中存在许多标红,说明还没有配置maven依赖,右击backend中的pom.xml进行配置加载,在加载前,记得去设置中更改maven的选择(顺便设置项目的java编译器版本为JDK17):

3.连接数据库

右侧的数据源中会有对应数据库的显示,但请先在本地导入左侧对应目录中的102101520_cyc_lab3.sql数据库备份文件,再在数据源中将用户名密码改为本机存在的MySQL用户名密码,数据库才算连接成功

4.启动后端

按下选择运行以启动后端服务器

5.启动前端

打开终端,先cd到frontend文件夹,再输入npm install(丢给同学测了一下,无法识别npm指令说明Node.js没安装好)和npm run serve启动前端服务器(frontend中有README.md,懒得敲指令可以直接复制粘贴到终端)

五、 系统主要功能界面介绍(需使用截图)

进入后首页设置为客户信息管理,可通过上方导航栏进行跳转。

1.客户信息管理:

实现增删改查功能,根据特定属性列的值升序或降序索引的功能

① 新增数据在右侧客户信息详情表单填写完后,按下插入数据后会调用一次获取全部信息,在左侧可以看到新增的数据(设置了ID自增,将ID降序排列时可以看到第一个就是新插入的数据)

插入前:

插入后:

② 删:按下删除按钮执行删除数据

③ 改:按下编辑按钮后对应表格行变为输入框状态,可以进行数据的修改。

④ 查:在客户信息管理页面实现了根据客户ID进行查询的功能。

2.供应商信息管理:

基础功能与客户信息管理类似,在查询部分实现对供应商名的模糊匹配查询,在小于2个汉字或4个字符时使用like进行模糊匹配,在大于等于2个汉字或4个字符时启用innodb全文索引和ngram全文解析器进行模糊匹配搜素(如搜“供应商们”会出现匹配到“供应”“应商”“商们”字段的数据)

小于4个字符:

搜索“供应商们”:

3.水产品信息管理

基础功能与上方的页面类似。

4.库存信息管理

5.入库记录管理

6.销售记录管理

7.订单记录管理

8.订单销售记录关系管理

9.订单供应商关系管理

10.签订关系管理

11.运货司机管理

12.运货记录管理

六、 实验结果总结:(分析系统运行效果,说明系统优缺点及改进方向)

系统运行效果基本符合预期。

优点:简洁直观,易于理解,上手性强;通过触发器、事务、存储过程,实现了表间数据联动(比如当某位客户与订单形成关系后,购买次数和总交易额会相应更新;订单与销售记录建立关系后,会根据销售记录的金额更新订单的总金额,在最后调用存储过程进行检验)。

缺点:因为设计的表有点多,后面没有时间深入改进了,比如,登录功能,数据加密功能,为不同级别的用户提供不同的视图功能。

改进方向:可以完善比如登录注册功能;根据使用者的角色权限为不同级别的用户提供不同的视图;数据加密功能,缓存功能等满足多样化需求的功能。

七、 编程工作总结:

在本次数据库实践中,我独立开发了水产贸易中心数据库应用系统,这是一个结合了前后端开发的全栈项目。在这个过程中,我学习并应用了多种技术和工具,包括 Spring Boot、Vue.js、Element-UI、MyBatis-Plus 和 Lombok 等,这些工具大大提升了我的开发效率。

在系统开发的过程中,我投入了大量的时间和精力。最初阶段,我花费了大量时间学习 Spring Boot 和 Vue.js,这两个框架是我项目中的核心技术。我通过阅读官方文档、教程和实际操作来掌握它们的基本原理和用法。同时,我也深入学习了 Element-UI,这是一个基于 Vue.js 的组件库,为我提供了丰富的界面组件和交互体验。

面临的困难主要集中在对新技术的学习和整合上。在学习 Spring Boot 和 Vue.js 的过程中,我遇到了一些概念上的难点,比如Axios跨域请求和前端组件的状态管理。为了解决这些问题,我积极参与社区讨论、查阅相关文档和博客,并进行了大量的实践和调试。

在项目中,我主要负责了前端和后端的开发工作。在前端方面,我设计并实现了用户管理、数据展示和交互等模块,利用 Vue.js 和 Element-UI 构建了用户友好的界面,并通过 RESTful API 与后端进行数据交互。在后端方面,我搭建了基于 Spring Boot 的后端框架,利用 MyBatis-Plus 进行数据持久化操作,同时运用了 Lombok 来简化实体类和数据访问层的代码。我还负责了系统的权限控制和数据验证等核心功能的开发工作。

在开发过程中,我遇到了一些技术挑战。比如,在前端开发中,我遇到了如何优雅地管理组件状态和异步数据加载的问题,我通过学习 Vuex 状态管理和 Promise 的使用,成功解决了这些挑战。在后端开发中,我遇到了如何设计合理的数据库模型和编写高效的 SQL 查询语句,通过对 MyBatis-Plus 的深入学习和实践,我成功地解决了这些问题。

在整个开发过程中,我也进行了一些创新的设计。

例如,在数据库中,我通过触发器、事务、存储过程,实现了表间数据联动(比如当某位客户与订单形成关系后,购买次数和总交易额会相应更新;订单与销售记录建立关系后,会根据销售记录的金额更新订单的总金额,在最后调用存储过程进行检验),以及通过商品权重综合计算更新商家热度的功能。

在前端界面设计中,我结合了 Element-UI 的组件和自定义样式,打造了符合用户习惯的界面风格。在后端开发中,我利用了 MyBatis-Plus 提供的代码生成器,极大地提升了数据访问层的开发效率。

通过这次实践,我获得了丰富的开发经验和技术实践。我深刻体会到了前后端开发的协同工作模式,也学会了如何在实际项目中运用所学的技术和工具。最重要的是,我对于团队协作、技术沟通和问题解决能力都有了显著的提升。这次项目不仅让我掌握了新的技术和工具,也让我对软件开发过程有了更深入的理解和认识。

总的来说,这次实践让我受益匪浅,我相信这些经验和收获将会成为我未来职业发展的宝贵财富。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/791513
推荐阅读
相关标签
  

闽ICP备14008679号