项目开辟背景
MyShop商城致力于提供流畅的购物体验,旨在为用户打造一个便捷的在线购物平台,涵盖了商品浏览、购物车管理、结算付款等功能。同时提供了背景管理系统,方便商家管理商品信息和订单。该项目必要一个可靠高效的数据库系统来管理商品、用户和订单信息。这个数据库系统必须具备出色的性能和可靠性,通过设计和优化提高系统相应速率和数据同等性。我们的目标是设计实现MyShop商城的数据库系统,从而为用户提供卓越的购物体验。通过这个项目,我们不但盼望学习MySQL数据库开辟技能,更致力于为用户创造一个简朴实用的购物平台。
开辟项目标目标及设计要求
项目目标
本项目旨在通过学习MySQL数据库应用,着重于购物网站系统的数据库设计。我们的目标是构建一个高效可靠的数据库系统,有用管理商品、用户和订单信息,从而提供顶尖的购物体验。通过理论与实践相结合,强调造就团队的协作沟通、数据库设计能力,并专注于最新技能的应用与掌握。同时,我们致力于建立"MyShop商城",为现代消费者打造一个便捷高效的在线购物平台,集成商品浏览、购物车管理、结算付款等功能,并借助背景管理系统提供用户友好的购物情况。我们的目标是通过学习MySQL数据库开辟技能,构建安全、高效的系统,满足用户的购物需求。
设计要求
为确保系统的稳固性、安全性和完整性,该项目设计要求包罗功能模块设计、数据库结构设计、数据安全性、数据同等性与完整性以及前后端交互实现,要求如下:
- 功能模块设计:划分并设计清楚的功能模块,涵盖用户管理、商品展示、购物车管理、订单处理、支付功能等,确保每个模块的功能完备并相互协调。
- 数据库结构设计:创建恰当的表结构,涵盖用户信息、商品数据、订单详情等核心信息,确保表之间的关联性和数据同等性,以支持系统各项功能的有用运作。
- 数据安全性:引入适当的加密技能,如暗码加密、传输加密等,确保用户信息在存储和传输过程中的安全,以防止数据泄漏或被未授权者访问。
- 同等性与完整性:设计数据束缚和验证规则,确保数据的同等性和完整性,制止数据冗余和错误,以提供准确可靠的信息支持系统运作。
- 前后端实现:使用Java与jsp技能实现前后端交互,确保系统各功能模块间数据的有用传递与协调运作,以提供用户流畅的体验。
数据库需求分析
用例和用例图
数据需求
MyShop 商城系统的数据需求包罗用户数据、地址数据、商品数据、购物车数据、订单数据和订单项数据。用户数据包罗账号、暗码、邮箱等信息,地址数据包罗收货地址和联系方式,商品数据包罗商品类别和详细信息,购物车数据用于记任命户选择的商品,订单数据用于管理用户的订单信息,订单项数据用于记录订单中每个商品的详细信息。通过满足这些数据需求,MyShop 商城系统可以实现用户管理、地址管理、商品展示、购物车管理、订单管理和订单项管理的功能。
处理需求
MyShop 商城系统的功能和数据处理方式,重要包罗用户管理、商品管理、购物车管理、订单管理、地址管理等方面。用户管理涵盖注册、登录、账号管理和权限控制;商品管理包罗商品信息的录入、更新和查询;购物车管理答应用户管理购物车中的商品;订单管理涉及订单的天生、处理和管理;地址管理用于管理用户的收货地址;通过对这些处理需求举行分析,可以确保系统可以或许满足商城的核心功能需求,并提供良好的用户体验和商城运营结果。
安全性与完整性要求
主键束缚
- 用户表(user):{u_id} 列被定义为主键。
- 地址表(address):{a_id} 列被定义为主键。
- 类别表(type):{t_id} 列被定义为主键。
- 商品表(product):{p_id} 列被定义为主键。
- 购物车表(cart):{c_id} 列被定义为主键。
- 订单表(orders):{o_id} 列被定义为主键。
- 订单项表(item):{i_id} 列被定义为主键。
唯一性束缚
- 用户表({user}):{u_name} 列被定义为唯一性束缚。
外键束缚
- 地址表(address):{u_id} 定义为外键束缚,引用用户表(user)的 u_id}列。
- 商品表(product):t_id定义为外键束缚,引用类别表(type)的 t_id 列。
- 购物车表(cart):u_id定义为外键束缚,引用用户表(user)的 u_id 列。
- 购物车表(cart):p_id 定义为外键束缚,引用商品表(product)的 p_id列。
- 订单表(orders):u_id定义为外键束缚,引用用户表(user)的 u_id 列。
- 订单表(orders):a_id 定义为外键束缚,引用地址表(address)的 a_id列。
- 订单项表(item):o_id定义为外键束缚,引用订单表(orders)的 o_id 列。
- 订单项表(item):p_id定义为外键束缚,引用商品表(product)的 p_id列。
ON DELETE 和 ON UPDATE 触发动作
- 在删除关联行时,购物车表(cart)和订单表(orders)的外键束缚使用 ON DELETE CASCADE
- 触发动作,表现删除关联行时自动删除相干行。 在更新关联行时,地址表(address)的外键束缚使用 ON UPDATE CASCADE 触发动作,表现更新关联行时自动更新相应行。
这些束缚条件确保了数据库中的数据同等性和完整性,限制了不精确的操作并保护了数据的准确性和可靠性。
数据库设计与实现
数据字典
用户信息数据结构的描述
数据结构名:user
说明:用于存储用户的账号信息和相干属性。
组成:u_id,u_name,u_password,u_email,u_sex,u_status,u_code,u_role
地址信息数据结构的描述
数据结构名: address
说明: 用于存储用户的收货地址信息。
组成:a_id,u_id,a_name,a_phone,a_detail,a_state
商品类别数据结构的描述
数据结构名:type
说明:用于存储商品的分类信息。
组成:t_id,t_name,t_info
商品数据结构的描述
数据结构名:product
说明:用于存储详细的商品信息。
组成:p_id,t_id,p_name,p_time,p_image,p_price,p_state,p_info
购物车数据结构的描述
数据结构名:cart
说明:用于存储用户的购物车信息。
组成: c_id,u_id,p_id,c_count,c_num
订单数据结构的描述
数据结构名:orders
说明:用于存储用户的订单信息。
组成: o_id,u_id,a_id,o_count,o_time,o_state
订单项数据结构的描述
数据结构名: item
说明:用于存储订单中每个商品的详细信息。
组成:i_id,o_id,p_id,i_count,i_num
概念模型及逻辑结构
实体图及 E-R 图
E-R 图转换为关系模式
表结构设计
编写程序
视图
视图 1:获取所有商品及其所属类别名称
- -- 视图1:获取所有商品及其所属类别名称
- CREATE VIEW vw_Products AS
- SELECT p.p_id, p.p_name, p.p_time, p.p_image, p.p_price, p.p_state, p.p_info, t.t_name
- FROM product p
- JOIN type t ON p.t_id = t.t_id;
- -- 查询所有商品及其所属类别名称
- SELECT * FROM vw_Products;
复制代码 视图 2:获取所有订单以及用户信息和地址详情
- -- 视图2:获取所有订单以及用户信息和地址详情
- CREATE VIEW vw_Orders AS
- SELECT o.o_id, o.o_count, o.o_time, o.o_state, u.u_name, u.u_email, u.u_sex, a.a_name, a.a_phone, a.a_detail
- FROM orders o
- JOIN `user` u ON o.u_id = u.u_id
- JOIN address a ON o.a_id = a.a_id;
- -- 查询所有订单以及用户信息和地址详情
- SELECT * FROM vw_Orders;
复制代码 视图3:获取用户的购物车内容
- -- 视图3:获取用户的购物车内容
- CREATE VIEW vw_Cart AS
- SELECT c.c_id, c.u_id, c.p_id, c.c_count, c.c_num, p.p_name, p.p_price, p.p_image
- FROM cart c
- JOIN product p ON c.p_id = p.p_id;
- -- 查询指定用户的购物车内容
- SELECT * FROM vw_Cart WHERE u_id = 5;
复制代码 视图4:获取用户的收货地址列表课程名
- -- 视图4:获取用户的收货地址列表
- CREATE VIEW vw_Addresses AS
- SELECT a.a_id, a.u_id, a.a_name, a.a_phone, a.a_detail, a.a_state, u.u_name
- FROM address a
- JOIN `user` u ON a.u_id = u.u_id;
- -- 查询指定用户的收货地址列表
- SELECT * FROM vw_Addresses WHERE u_id = 4;
复制代码 视图5:获取用户的订单详情
- -- 视图5:获取用户的订单详情
- CREATE VIEW vw_UserOrders AS
- SELECT o.o_id, o.o_count, o.o_time, o.o_state, u.u_name, u.u_email, u.u_sex, a.a_name, a.a_phone, a.a_detail
- FROM orders o
- JOIN `user` u ON o.u_id = u.u_id
- JOIN address a ON o.a_id = a.a_id;
- -- 查询指定用户的订单详情
- SELECT * FROM vw_UserOrders WHERE u_name = 'user4'; -- 使用用户名来指定用户
复制代码 存储过程
存储过程1:添加商品到购物车
- -- 存储过程1:添加商品到购物车
- DELIMITER //
- CREATE PROCEDURE sp_AddToCart(
- IN user_id INT,
- IN product_id INT,
- IN quantity INT
- )
- BEGIN
- INSERT INTO cart (u_id, p_id, c_num, c_count)
- VALUES (user_id, product_id, quantity, (SELECT p_price FROM product WHERE p_id = product_id) * quantity);
- END//
- DELIMITER ;
- -- 调用存储过程 sp_AddToCart 将商品添加到购物车
- CALL sp_AddToCart(4, 3, 2);
- -- 查询结果
- SELECT * FROM cart;
复制代码 存储过程2:创建订单
- -- 存储过程2:创建订单
- DELIMITER //
-
- CREATE PROCEDURE sp_CreateOrder(
- IN user_id INT,
- IN address_id INT
- )
- BEGIN
- DECLARE order_id VARCHAR(64);
- SET order_id = UUID(); -- 使用 UUID() 函数生成唯一订单编号
-
- INSERT INTO orders (o_id, u_id, a_id, o_count, o_time, o_state)
- SELECT order_id, user_id, address_id, SUM(c.c_count), NOW(), 0
- FROM cart c
- WHERE c.u_id = user_id;
- DELETE FROM cart WHERE u_id = user_id; -- 清空购物车中该用户的商品
- END//
-
- DELIMITER ;
-
-
- -- 调用存储过程 sp_CreateOrder 创建订单
- CALL sp_CreateOrder(4, 4);
- -- 查询结果
- SELECT * FROM orders;
复制代码 存储过程3:更新订单状态
- -- 存储过程3:更新订单状态
- DELIMITER //
- CREATE PROCEDURE sp_UpdateOrderStatus(
- IN order_id VARCHAR(64),
- IN new_state INT
- )
- BEGIN
- UPDATE orders
- SET o_state = new_state
- WHERE o_id = order_id;
- END//
- DELIMITER ;
- -- 调用存储过程 sp_UpdateOrderStatus 更新订单状态
- CALL sp_UpdateOrderStatus('order2', 4);
- -- 查询结果
- SELECT * FROM orders;
复制代码 触发器及事务
- -- 触发器,在将商品添加到订单时,将相关商品从购物车中移除。
- -- 同时,我们将在这个过程中使用事务来确保操作的一致性。
- DELIMITER //
- CREATE TRIGGER trg_AddToOrder
- AFTER INSERT ON orders
- FOR EACH ROW
- BEGIN
- DECLARE cart_count INT;
- -- 获取购物车中相应商品的数量
- SELECT c_num INTO cart_count FROM cart WHERE p_id = NEW.p_id AND u_id = NEW.u_id;
- -- 如果购物车中有相关商品,则将其移除
- IF cart_count > 0 THEN
- DELETE FROM cart WHERE p_id = NEW.p_id AND u_id = NEW.u_id;
- END IF;
- END;
- //
- DELIMITER ;
- -- 事务,将商品添加到购物车并创建订单
- START TRANSACTION; -- 开始事务
- CALL sp_AddToCart(3, 3, 2); -- 将商品添加到购物车
- CALL sp_CreateOrder(3, 4); -- 创建订单
- COMMIT; -- 提交事务,保存更改
复制代码 变乱
- -- 创建每日数据备份的事件
- DELIMITER //
- CREATE EVENT IF NOT EXISTS daily_data_backup
- ON SCHEDULE EVERY 1 DAY
- STARTS TIMESTAMP(NOW() + INTERVAL 1 DAY)
- ON COMPLETION PRESERVE
- DO
- BEGIN
- SET @backup_file_name = CONCAT('backup_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), '.sql');
- SET @backup_path = '/path/to/backup/directory/';
- SET @backup_command = CONCAT('mysqldump -u username -pPassword MyShop > ', @backup_path, @backup_file_name);
- PREPARE stmt FROM @backup_command;
- EXECUTE stmt;
- DEALLOCATE PREPARE stmt;
- INSERT INTO backup_logs (backup_name, backup_time) VALUES (@backup_file_name, NOW());
- END;
- //
- DELIMITER ;
复制代码 数据完整性
定义各表的主键(在建表的时候定义)
- -- 定义用户表主键
- u_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- -- 定义地址表主键
- a_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- -- 定义商品类别表主键
- t_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- -- 定义商品表主键
- p_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- -- 定义购物车表主键
- c_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- -- 定义订单表主键
- o_id VARCHAR(64) NOT NULL PRIMARY KEY,
- -- 定义订单项表主键
- i_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
复制代码 删除用户表时同时删除 地址表表中相干行的行为
- -- 删除 user 表的记录时同时删除 address 表中相关行的行为,可以使用 ON DELETE CASCADE 来定义外键约束。
- ALTER TABLE address
- ADD CONSTRAINT FK_u_a_fk -- 添加一个名为 FK_u_a_fk 的约束
- FOREIGN KEY (u_id) -- 该约束是针对 u_id 列的外键约束
- REFERENCES user (u_id) -- 指定引用的主键表和主键列,这里是 user 表的 u_id 列
- ON DELETE CASCADE -- 指定在删除关联行时自动删除相关行
- ON UPDATE CASCADE; -- 指定在更新关联行时自动更新相应行
复制代码 将类别表删除或修改时,商品表的类别要同步删除或修改
- ALTER TABLE product
- ADD CONSTRAINT FK_t_p_fk
- FOREIGN KEY (t_id)
- REFERENCES type (t_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE;
复制代码 删除或修改用户时,同时删除或修改购物车中与该用户关联的数据
- -- 外键约束与用户表 user 的关联
- ALTER TABLE cart
- ADD CONSTRAINT FK_u_c_fk
- FOREIGN KEY (u_id)
- REFERENCES `user`(u_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE;
复制代码 删除商品时,同时删除购物车中与该商品关联的数据
- -- 外键约束与商品表 product 的关联
- ALTER TABLE cart
- ADD CONSTRAINT FK_cart_product
- FOREIGN KEY (p_id)
- REFERENCES product (p_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE;
-
复制代码 在删除用户时,同时删除与该用户关联的订单数据
- -- 添加外键约束与 user 表的关联;可以保证在删除用户时,同时删除与该用户关联的订单数据。
- ALTER TABLE orders
- ADD CONSTRAINT FK_u_o_fk
- FOREIGN KEY (u_id)
- REFERENCES `user` (u_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE;
复制代码 orders与 address 表的关联:在删除或更新关联行时不采取任何动作。
- ALTER TABLE orders
- ADD CONSTRAINT FK_a_o_fk
- FOREIGN KEY (a_id)
- REFERENCES address (a_id)
- ON DELETE NO ACTION
- ON UPDATE NO ACTION;
复制代码 实现级联删除或更新。在删除或更新订单时,相干的订单项也会被删除或更新
- ALTER TABLE item
- ADD CONSTRAINT FK_item_orders
- FOREIGN KEY (o_id)
- REFERENCES orders (o_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE;
复制代码 item与 product 表的关联,在删除或更新关联行时不采取任何动作限制条件}
- ALTER TABLE item
- ADD CONSTRAINT FK_p_i_fk FOREIGN KEY (p_id)
- REFERENCES product (p_id)
- ON DELETE NO ACTION
- ON UPDATE NO ACTION;
复制代码 数据更新
插入数据
- -- 向 user 表插入虚拟数据
- INSERT INTO user (u_name, u_password, u_email, u_sex, u_status, u_code, u_role)
- VALUES
- ('user1', 'password1', 'user1@example.com', '男', 1, 'code1', 1),
- ('user2', 'password2', 'user2@example.com', '女', 1, 'code2', 1),
- ('user3', 'password3', 'user3@example.com', '男', 1, 'code3', 1),
- ('user4', 'password4', 'user4@example.com', '女', 1, 'code4', 1),
- ('user5', 'password5', 'user5@example.com', '男', 0, 'code5', 1),
- ('user6', 'password6', 'user6@example.com', '女', 0, 'code6', 1),
- ('user7', 'password7', 'user7@example.com', '男', 1, 'code7', 1),
- ('user8', 'password8', 'user8@example.com', '女', 1, 'code8', 1),
- ('user9', 'password9', 'user9@example.com', '男', 1, 'code9', 1),
- ('user10', 'password10', 'user10@example.com', '女', 1, 'code10', 1);
- -- 向 address 表插入虚拟数据
- INSERT INTO address (u_id, a_name, a_phone, a_detail, a_state)
- VALUES
- (1, 'user1', '1234567890', 'City1', 1),
- (2, 'user2', '9876543210', 'City2', 0),
- (3, 'user3', '1111111111', 'City3', 1),
- (4, 'user4', '2222222222', 'City4', 0),
- (5, 'user5', '3333333333', 'City5', 1),
- (6, 'user6', '4444444444', 'City6', 0),
- (7, 'user7', '5555555555', 'City7', 1),
- (8, 'user8', '6666666666', 'City8', 0),
- (9, 'user9', '7777777777', 'City9', 1),
- (10, 'user10', '8888888888', 'City10', 0);
- -- 商品类别表插入虚拟数据
- INSERT INTO type (t_name, t_info)
- VALUES ('电子产品', '包括手机、电脑、平板等电子设备'),
- ('服装', '包括男装、女装、童装等各种服装'),
- ('家居用品', '包括家具、家饰、厨具等家居用品');
- -- 商品表插入虚拟数据
- INSERT INTO product (t_id, p_name, p_time, p_image, p_price, p_state, p_info)
- VALUES (1, 'iPhone 12', '2021-01-01', 'image1.jpg', 999.99, 10, '最新款iPhone手机'),
- (1, 'MacBook Pro', '2021-02-01', 'image2.jpg', 1999.99, 8, '高性能笔记本电脑'),
- (2, 'T-shirt', '2021-03-01', 'image3.jpg', 19.99, 5, '简约款T恤'),
- (2, 'Dress', '2021-04-01', 'image4.jpg', 49.99, 7, '时尚连衣裙'),
- (3, 'Sofa', '2021-05-01', 'image5.jpg', 599.99, 6, '舒适沙发'),
- (3, 'Table Lamp', '2021-06-01', 'image6.jpg', 29.99, 4, '台灯'),
- (1, 'AirPods', '2021-07-01', 'image7.jpg', 149.99, 9, '无线耳机'),
- (2, 'Jeans', '2021-08-01', 'image8.jpg', 39.99, 6, '经典牛仔裤'),
- (2, 'Shoes', '2021-09-01', 'image9.jpg', 79.99, 7, '时尚鞋子'),
- (3, 'Cookware Set', '2021-10-01', 'image10.jpg', 199.99, 8, '厨具套装');
复制代码 修改数据
- -- 更新 address 表中的数据
- UPDATE address SET a_name = 'newname' WHERE a_id = 1;
- -- 根据类别ID更新类别名称和描述
- UPDATE type SET t_name = '数码产品', t_info = '包括手机、电脑、相机等数码设备' WHERE t_id = 1;
- -- 根据类别名称更新类别描述
- UPDATE type SET t_info = '包括男装、女装、童装等各种时尚服饰' WHERE t_name = '服装';
- -- 根据商品ID更新商品名称和描述
- UPDATE product SET p_name = 'iPhone 13', p_info = '最新款iPhone手机' WHERE p_id = 1;
- -- 根据商品名称更新商品价格
- UPDATE product SET p_price = 1099.99 WHERE p_name = 'MacBook Pro';
- -- 修改购物车中特定用户和商品的数量和小计
- UPDATE cart SET c_num = 3, c_count = 15.99 WHERE u_id = 2 AND p_id = 1;
- -- 更新订单状态为已付款
- UPDATE orders SET o_state = 1 WHERE o_id = 'order1';
- -- 修改订单项的数量和小计
- UPDATE item SET i_num = 3, i_count = 29.99 WHERE i_id = 1;
复制代码 删除数据
- -- 删除 user 表中的数据
- DELETE FROM user WHERE u_id = 1;
- -- 删除 address 表中的数据
- DELETE FROM address WHERE a_id = 2;
- -- 根据类别名称删除类别
- DELETE FROM type WHERE t_name = '电子产品';
- -- 根据类别ID删除类别
- DELETE FROM type WHERE t_id = 1;
- -- 删除所有商品
- DELETE FROM product;
- -- 根据商品名称删除商品
- DELETE FROM product WHERE p_name = 'iPhone 12';
- -- 根据商品ID删除商品
- DELETE FROM product WHERE p_id = 1;
- -- 删除特定用户的购物车记录
- DELETE FROM cart WHERE u_id = 1;
- -- 删除特定商品的购物车记录
- DELETE FROM cart WHERE p_id = 2;
- -- 删除订单
- DELETE FROM orders WHERE o_id = 'order1';
- -- 删除用户ID为2的所有订单
- DELETE FROM orders WHERE u_id = 2;
- -- 删除指定的订单项
- DELETE FROM item WHERE i_id = 2;
复制代码 权限管理
由sa给组长授予管理员权限
- -- 创建组长账户
- CREATE USER '组长'@'localhost' IDENTIFIED BY 'password';
- -- 赋予管理员权限给组长
- GRANT ALL PRIVILEGES ON *.* TO '组长'@'localhost' WITH GRANT OPTION;
复制代码 由组长创建项目角色,并授予项目角色相干权限
- -- 由组长创建项目角色,并授予项目角色相关权限
- CREATE ROLE 项目角色;
- GRANT SELECT, INSERT, UPDATE, DELETE ON MyShop.orders TO 项目角色;
复制代码 由组长将组员与项目角色捆绑
- -- 由组长将组员与项目角色捆绑
- CREATE USER '组员'@'localhost' IDENTIFIED BY 'password';
- GRANT SELECT, INSERT, UPDATE, DELETE ON MyShop.orders TO '组员'@'localhost';
复制代码 由组长给组员授予登录本组项目数据库的权限
- -- 给予组员登录本组项目数据库的权限
- GRANT USAGE ON *.* TO '组员'@'localhost';
复制代码 数据库备份与规复
数据库备份
要在 MySQL 中备份数据库,可以使用 mysqldump 命令行工具。
- -- 备份整个数据库:
- mysqldump -u root -pAa2803345646 MyShop > backup.sql
复制代码 数据库规复
- mysql -u root -p MyShop < backup.sql
复制代码 前端界面设计
项目代码下载
下载:代码与实验陈诉(包罗平常作业的)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |