From 59a2e2874749cdc51caf5e34e048ddf605555991 Mon Sep 17 00:00:00 2001 From: cao <2898376372@qq.com> Date: Sun, 29 Dec 2024 10:13:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93sql=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=9C=80=E7=BB=88=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- final/all.sql | 333 +++++++++ final/create.sql | 79 +++ final/createindex.sql | 30 + final/creatview.sql | 32 + final/dump-DrivingSchool-202412251458.sql | 801 ++++++++++++++++++++++ final/insert.sql | 142 ++++ final/procedure.sql | 66 ++ final/search.sql | 118 ++++ final/security.sql | 42 ++ final/trigger.sql | 60 ++ final/update.sql | 89 +++ final/高级语言.py | 336 +++++++++ 12 files changed, 2128 insertions(+) create mode 100644 final/all.sql create mode 100644 final/create.sql create mode 100644 final/createindex.sql create mode 100644 final/creatview.sql create mode 100644 final/dump-DrivingSchool-202412251458.sql create mode 100644 final/insert.sql create mode 100644 final/procedure.sql create mode 100644 final/search.sql create mode 100644 final/security.sql create mode 100644 final/trigger.sql create mode 100644 final/update.sql create mode 100644 final/高级语言.py diff --git a/final/all.sql b/final/all.sql new file mode 100644 index 0000000..c53da83 --- /dev/null +++ b/final/all.sql @@ -0,0 +1,333 @@ +-- 创建数据库 + +-- 创建数据表 +CREATE TABLE admin ( + admin_name VARCHAR(255) PRIMARY KEY, + password VARCHAR(255) NOT NULL +); + +CREATE TABLE account ( + account_id SERIAL PRIMARY KEY, + type VARCHAR(50), + status VARCHAR(50), + created_by VARCHAR(255) REFERENCES admin(admin_name) +); + +CREATE TABLE venue ( + venue_id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + capacity INT NOT NULL CHECK (capacity > 0) +); + +CREATE TABLE student ( + student_id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + password VARCHAR(255) NOT NULL, + personal_info_id INT UNIQUE, + FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id) +); + +CREATE TABLE coach ( + coach_id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + password VARCHAR(255) NOT NULL, + personal_info_id INT UNIQUE, + FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id) +); + +CREATE TABLE appointment ( + appointment_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id), + venue_id INT NOT NULL REFERENCES venue(venue_id), + period VARCHAR(50) NOT NULL, + status VARCHAR(50) NOT NULL, + feedback_id INT REFERENCES feedback(feedback_id) +); + +CREATE TABLE feedback ( + feedback_id SERIAL PRIMARY KEY, + content TEXT NOT NULL, + date DATE NOT NULL +); + +CREATE TABLE invoice ( + invoice_id SERIAL PRIMARY KEY, + amount DECIMAL(10, 2) NOT NULL CHECK (amount >= 0), + date DATE NOT NULL, + appointment_id INT REFERENCES appointment(appointment_id) +); + +CREATE TABLE personal_info ( + info_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + phone VARCHAR(20), + email VARCHAR(255) +); + +CREATE TABLE training_record ( + record_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id), + feedback TEXT, + appointment_id INT REFERENCES appointment(appointment_id) +); + +CREATE TABLE booking_slot ( + slot_id SERIAL PRIMARY KEY, + start_time TIME NOT NULL, + end_time TIME NOT NULL CHECK (end_time > start_time), + venue_id INT NOT NULL REFERENCES venue(venue_id) +); +-- 初始化ADMIN表 +INSERT INTO admin (admin_name, password) VALUES ('admin1', 'password1'); +INSERT INTO admin (admin_name, password) VALUES ('admin2', 'password2'); + +-- 初始化ACCOUNT表 +INSERT INTO account (type, status, created_by) VALUES ('student', 'active', 'admin1'); +INSERT INTO account (type, status, created_by) VALUES ('coach', 'active', 'admin1'); + +-- 初始化VENUE表 +INSERT INTO venue (name, capacity) VALUES ('Venue A', 10); +INSERT INTO venue (name, capacity) VALUES ('Venue B', 15); + +-- 初始化STUDENT表 +INSERT INTO personal_info (phone, email) VALUES ('1234567890', 'student1@example.com'); +INSERT INTO student (student_id, name, password, personal_info_id) VALUES ('S001', 'Student One', 'pass1', 1); + +-- 初始化COACH表 +INSERT INTO personal_info (phone, email) VALUES ('0987654321', 'coach1@example.com'); +INSERT INTO coach (coach_id, name, password, personal_info_id) VALUES ('C001', 'Coach One', 'pass1', 2); + +-- 初始化APPOINTMENT表 +INSERT INTO appointment (student_id, coach_id, venue_id, period, status) VALUES ('S001', 'C001', 1, 'Morning', 'Scheduled'); + +-- 初始化FEEDBACK表 +INSERT INTO feedback (content, date) VALUES ('Great session!', '2024-12-01'); + +-- 初始化INVOICE表 +INSERT INTO invoice (amount, date, appointment_id) VALUES (100.00, '2024-12-01', 1); + +-- 初始化TRAINING_RECORD表 +INSERT INTO training_record (student_id, coach_id, feedback, appointment_id) VALUES ('S001', 'C001', 'Good progress.', 1); + +-- 初始化BOOKING_SLOT表 +INSERT INTO booking_slot (start_time, end_time, venue_id) VALUES ('09:00:00', '10:00:00', 1); +-- 学生信息视图 +CREATE VIEW StudentInfoView AS +SELECT s.student_id, s.name, p.phone, p.email +FROM student s +JOIN personal_info p ON s.personal_info_id = p.info_id; + +-- 教练信息视图 +CREATE VIEW CoachInfoView AS +SELECT c.coach_id, c.name, p.phone, p.email +FROM coach c +JOIN personal_info p ON c.personal_info_id = p.info_id; + +-- 预约详情视图 +CREATE VIEW AppointmentDetailView AS +SELECT a.appointment_id, s.name AS student_name, c.name AS coach_name, v.name AS venue_name, a.period, a.status +FROM appointment a +JOIN student s ON a.student_id = s.student_id +JOIN coach c ON a.coach_id = c.coach_id +JOIN venue v ON a.venue_id = v.venue_id; + +-- 训练记录视图 +CREATE VIEW TrainingRecordView AS +SELECT t.record_id, s.name AS student_name, c.name AS coach_name, t.feedback +FROM training_record t +JOIN student s ON t.student_id = s.student_id +JOIN coach c ON t.coach_id = c.coach_id; + +-- 发票详情视图 +CREATE VIEW InvoiceDetailView AS +SELECT i.invoice_id, i.amount, i.date, a.student_id, a.coach_id, a.venue_id +FROM invoice i +JOIN appointment a ON i.appointment_id = a.appointment_id; +-- 在appointment表的period字段上创建索引 +CREATE INDEX idx_appointment_period ON appointment(period); + +-- 在feedback表的date字段上创建索引 +CREATE INDEX idx_feedback_date ON feedback(date); + +-- 在invoice表的date字段上创建索引 +CREATE INDEX idx_invoice_date ON invoice(date); + +-- 在training_record表的record_id字段上创建索引 +CREATE INDEX idx_training_record_record_id ON training_record(record_id); + +-- 在booking_slot表的start_time和end_time字段上创建复合索引 +CREATE INDEX idx_booking_slot_start_end_time ON booking_slot(start_time, end_time); + +-- 在account表的status字段上创建索引 +CREATE INDEX idx_account_status ON account(status); + +-- 在student表的name字段上创建索引 +CREATE INDEX idx_student_name ON student(name); + +-- 在coach表的name字段上创建索引 +CREATE INDEX idx_coach_name ON coach(name); + +-- 在venue表的name字段上创建索引 +CREATE INDEX idx_venue_name ON venue(name); + +-- 在personal_info表的email字段上创建唯一索引 +CREATE UNIQUE INDEX idx_personal_info_email ON personal_info(email); +-- 添加新学员的存储过程 +CREATE OR REPLACE FUNCTION AddNewStudent( + _student_id VARCHAR(255), + _name VARCHAR(255), + _password VARCHAR(255), + _phone VARCHAR(20), + _email VARCHAR(255) +) RETURNS VOID AS $$ +DECLARE + _info_id INT; +BEGIN + INSERT INTO personal_info (phone, email) VALUES (_phone, _email) RETURNING info_id INTO _info_id; + INSERT INTO student (student_id, name, password, personal_info_id) VALUES (_student_id, _name, _password, _info_id); +END; +$$ LANGUAGE plpgsql; + +-- 更新教练电话的存储过程 +CREATE OR REPLACE FUNCTION UpdateCoachPhone( + _coach_id VARCHAR(255), + _new_phone VARCHAR(20) +) RETURNS VOID AS $$ +BEGIN + UPDATE personal_info SET phone = _new_phone WHERE info_id = (SELECT personal_info_id FROM coach WHERE coach_id = _coach_id); +END; +$$ LANGUAGE plpgsql; + +-- 获取某个学生的所有预约的存储过程 +CREATE OR REPLACE FUNCTION GetStudentAppointments( + _student_id VARCHAR(255) +) RETURNS TABLE(appointment_id INT, coach_name VARCHAR(255), venue_name VARCHAR(255), period VARCHAR(50), status VARCHAR(50)) AS $$ +BEGIN + RETURN QUERY + SELECT a.appointment_id, c.name AS coach_name, v.name AS venue_name, a.period, a.status + FROM appointment a + JOIN coach c ON a.coach_id = c.coach_id + JOIN venue v ON a.venue_id = v.venue_id + WHERE a.student_id = _student_id; +END; +$$ LANGUAGE plpgsql; + +-- 获取某个教练的所有反馈的存储过程 +CREATE OR REPLACE FUNCTION GetCoachFeedbacks( + _coach_id VARCHAR(255) +) RETURNS TABLE(feedback_id INT, content TEXT, date DATE) AS $$ +BEGIN + RETURN QUERY + SELECT f.feedback_id, f.content, f.date + FROM feedback f + JOIN training_record t ON f.feedback_id = t.feedback_id + WHERE t.coach_id = _coach_id; +END; +$$ LANGUAGE plpgsql; + +-- 获取某个场地的所有可用时间段的存储过程 +CREATE OR REPLACE FUNCTION GetAvailableSlotsForVenue( + _venue_id INT +) RETURNS TABLE(slot_id INT, start_time TIME, end_time TIME) AS $$ +BEGIN + RETURN QUERY + SELECT bs.slot_id, bs.start_time, bs.end_time + FROM booking_slot bs + LEFT JOIN appointment a ON bs.venue_id = a.venue_id AND bs.start_time <= a.period::time AND bs.end_time >= a.period::time + WHERE bs.venue_id = _venue_id AND a.appointment_id IS NULL; +END; +$$ LANGUAGE plpgsql; +-- 当插入新的学生时,自动在personal_info表中插入一条记录 +CREATE OR REPLACE FUNCTION InsertPersonalInfoOnStudentInsert() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO personal_info (phone, email) VALUES ('', ''); + NEW.personal_info_id := currval('personal_info_info_id_seq'); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_insert_personal_info_on_student_insert +BEFORE INSERT ON student +FOR EACH ROW EXECUTE FUNCTION InsertPersonalInfoOnStudentInsert(); + +-- 当删除一个教练时,自动删除其关联的personal_info记录 +CREATE OR REPLACE FUNCTION DeletePersonalInfoOnCoachDelete() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM personal_info WHERE info_id = OLD.personal_info_id; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_delete_personal_info_on_coach_delete +AFTER DELETE ON coach +FOR EACH ROW EXECUTE FUNCTION DeletePersonalInfoOnCoachDelete(); + +-- 当插入新的预约时,检查是否已经有重叠的时间段 +CREATE OR REPLACE FUNCTION CheckOverlapBeforeAppointmentInsert() +RETURNS TRIGGER AS $$ +DECLARE + overlap_count INT; +BEGIN + SELECT COUNT(*) INTO overlap_count + FROM appointment a + WHERE a.venue_id = NEW.venue_id + AND ((a.period = NEW.period) + OR (a.period < NEW.period AND a.period + INTERVAL '1 hour' > NEW.period) + OR (a.period > NEW.period AND a.period < NEW.period + INTERVAL '1 hour')); + IF overlap_count > 0 THEN + RAISE EXCEPTION 'There is an overlapping appointment at the same time and place.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_check_overlap_before_appointment_insert +BEFORE INSERT ON appointment +FOR EACH ROW EXECUTE FUNCTION CheckOverlapBeforeAppointmentInsert(); + +-- 当更新发票金额时,确保金额不小于零 +CREATE OR REPLACE FUNCTION EnsureInvoiceAmountNonNegative() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.amount < 0 THEN + RAISE EXCEPTION 'Invoice amount cannot be negative.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_ensure_invoice_amount_non_negative +BEFORE UPDATE ON invoice +FOR EACH ROW EXECUTE FUNCTION EnsureInvoiceAmountNonNegative(); +-- 创建角色 +CREATE ROLE AdminRole LOGIN PASSWORD 'admin_password'; +CREATE ROLE CoachRole LOGIN PASSWORD 'coach_password'; +CREATE ROLE StudentRole LOGIN PASSWORD 'student_password'; + +-- 授予AdminRole权限 +GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE account_account_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE venue_venue_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE student_student_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE coach_coach_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE appointment_appointment_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE feedback_feedback_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE invoice_invoice_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE personal_info_info_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE training_record_record_id_seq TO AdminRole; +GRANT USAGE, SELECT, UPDATE ON SEQUENCE booking_slot_slot_id_seq TO AdminRole; + +-- 授予CoachRole权限 +GRANT SELECT, INSERT, UPDATE ON appointment TO CoachRole; +GRANT SELECT, INSERT, UPDATE ON feedback TO CoachRole; +GRANT SELECT, INSERT, UPDATE ON training_record TO CoachRole; + +-- 授予StudentRole权限 +GRANT SELECT, INSERT, UPDATE ON appointment TO StudentRole; +GRANT SELECT, INSERT, UPDATE ON feedback TO StudentRole; +GRANT SELECT, INSERT, UPDATE ON training_record TO StudentRole; +GRANT SELECT ON invoice TO StudentRole; \ No newline at end of file diff --git a/final/create.sql b/final/create.sql new file mode 100644 index 0000000..4f7f7a7 --- /dev/null +++ b/final/create.sql @@ -0,0 +1,79 @@ +-- 创建数据表 +CREATE TABLE admin ( + admin_name VARCHAR(255) PRIMARY KEY, + password VARCHAR(255) NOT NULL +); + +CREATE TABLE account ( + account_id SERIAL PRIMARY KEY, + type VARCHAR(50), + status VARCHAR(50), + created_by VARCHAR(255) REFERENCES admin(admin_name) +); + +CREATE TABLE venue ( + venue_id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + capacity INT NOT NULL CHECK (capacity > 0) +); + +CREATE TABLE student ( + student_id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + password VARCHAR(255) NOT NULL, + personal_info_id INT UNIQUE, + FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id) +); + +CREATE TABLE coach ( + coach_id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + password VARCHAR(255) NOT NULL, + personal_info_id INT UNIQUE, + FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id) +); + +CREATE TABLE appointment ( + appointment_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id), + venue_id INT NOT NULL REFERENCES venue(venue_id), + period VARCHAR(50) NOT NULL, + status VARCHAR(50) NOT NULL, + feedback_id INT REFERENCES feedback(feedback_id) +); + +CREATE TABLE feedback ( + feedback_id SERIAL PRIMARY KEY, + content TEXT NOT NULL, + date DATE NOT NULL +); + +CREATE TABLE invoice ( + invoice_id SERIAL PRIMARY KEY, + amount DECIMAL(10, 2) NOT NULL CHECK (amount >= 0), + date DATE NOT NULL, + appointment_id INT REFERENCES appointment(appointment_id) +); + +CREATE TABLE personal_info ( + info_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + phone VARCHAR(20), + email VARCHAR(255) +); + +CREATE TABLE training_record ( + record_id SERIAL PRIMARY KEY, + student_id VARCHAR(255) NOT NULL REFERENCES student(student_id), + coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id), + feedback TEXT, + appointment_id INT REFERENCES appointment(appointment_id) +); + +CREATE TABLE booking_slot ( + slot_id SERIAL PRIMARY KEY, + start_time TIME NOT NULL, + end_time TIME NOT NULL CHECK (end_time > start_time), + venue_id INT NOT NULL REFERENCES venue(venue_id) +); \ No newline at end of file diff --git a/final/createindex.sql b/final/createindex.sql new file mode 100644 index 0000000..697acd8 --- /dev/null +++ b/final/createindex.sql @@ -0,0 +1,30 @@ +-- 在appointment表的period字段上创建索引 +CREATE INDEX idx_appointment_period ON appointment(period); + +-- 在feedback表的date字段上创建索引 +CREATE INDEX idx_feedback_date ON feedback(date); + +-- 在invoice表的date字段上创建索引 +CREATE INDEX idx_invoice_date ON invoice(date); + +-- 在training_record表的record_id字段上创建索引 +CREATE INDEX idx_training_record_record_id ON training_record(record_id); + +-- 在booking_slot表的start_time和end_time字段上创建复合索引 +CREATE INDEX idx_booking_slot_start_end_time ON booking_slot(start_time, end_time); + +-- 在account表的status字段上创建索引 +CREATE INDEX idx_account_status ON account(status); + +-- 在student表的name字段上创建索引 +CREATE INDEX idx_student_name ON student(name); + +-- 在coach表的name字段上创建索引 +CREATE INDEX idx_coach_name ON coach(name); + +-- 在venue表的name字段上创建索引 +CREATE INDEX idx_venue_name ON venue(name); + +-- 在personal_info表的email字段上创建唯一索引 +CREATE UNIQUE INDEX idx_personal_info_email ON personal_info(email); +-- 添加新学员的存储过程 \ No newline at end of file diff --git a/final/creatview.sql b/final/creatview.sql new file mode 100644 index 0000000..71038da --- /dev/null +++ b/final/creatview.sql @@ -0,0 +1,32 @@ +-- 学生信息视图 +CREATE VIEW StudentInfoView AS +SELECT s.student_id, s.name, p.phone, p.email +FROM student s +JOIN personal_info p ON s.personal_info_id = p.info_id; + +-- 教练信息视图 +CREATE VIEW CoachInfoView AS +SELECT c.coach_id, c.name, p.phone, p.email +FROM coach c +JOIN personal_info p ON c.personal_info_id = p.info_id; + +-- 预约详情视图 +CREATE VIEW AppointmentDetailView AS +SELECT a.appointment_id, s.name AS student_name, c.name AS coach_name, v.name AS venue_name, a.period, a.status +FROM appointment a +JOIN student s ON a.student_id = s.student_id +JOIN coach c ON a.coach_id = c.coach_id +JOIN venue v ON a.venue_id = v.venue_id; + +-- 训练记录视图 +CREATE VIEW TrainingRecordView AS +SELECT t.record_id, s.name AS student_name, c.name AS coach_name, t.feedback +FROM training_record t +JOIN student s ON t.student_id = s.student_id +JOIN coach c ON t.coach_id = c.coach_id; + +-- 发票详情视图 +CREATE VIEW InvoiceDetailView AS +SELECT i.invoice_id, i.amount, i.date, a.student_id, a.coach_id, a.venue_id +FROM invoice i +JOIN appointment a ON i.appointment_id = a.appointment_id; \ No newline at end of file diff --git a/final/dump-DrivingSchool-202412251458.sql b/final/dump-DrivingSchool-202412251458.sql new file mode 100644 index 0000000..6576cfc --- /dev/null +++ b/final/dump-DrivingSchool-202412251458.sql @@ -0,0 +1,801 @@ +-- MySQL dump 10.13 Distrib 8.0.19, for Win64 (x86_64) +-- +-- Host: localhost Database: DrivingSchool +-- ------------------------------------------------------ +-- Server version 8.0.40 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `account` +-- + +DROP TABLE IF EXISTS `account`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `account` ( + `account_id` int NOT NULL AUTO_INCREMENT, + `type` varchar(50) DEFAULT NULL, + `status` varchar(50) DEFAULT NULL, + `created_by` varchar(255) DEFAULT NULL, + PRIMARY KEY (`account_id`), + KEY `created_by` (`created_by`), + CONSTRAINT `account_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `admin` (`admin_name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `account` +-- + +LOCK TABLES `account` WRITE; +/*!40000 ALTER TABLE `account` DISABLE KEYS */; +INSERT INTO `account` VALUES (1,'管理员','活跃','张伟'),(2,'学员','活跃','张伟'),(3,'教练','活跃','李娜'),(4,'学员','停用','李娜'),(5,'管理员','活跃','李娜'),(6,'学员','活跃','张伟'),(7,'教练','活跃','张伟'),(8,'学员','活跃','李娜'),(9,'教练','停用','张伟'),(10,'学员','活跃','李娜'); +/*!40000 ALTER TABLE `account` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `admin` +-- + +DROP TABLE IF EXISTS `admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `admin` ( + `admin_name` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + PRIMARY KEY (`admin_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `admin` +-- + +LOCK TABLES `admin` WRITE; +/*!40000 ALTER TABLE `admin` DISABLE KEYS */; +INSERT INTO `admin` VALUES ('张伟','password123'),('李娜','securepass'); +/*!40000 ALTER TABLE `admin` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `appointment` +-- + +DROP TABLE IF EXISTS `appointment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `appointment` ( + `appointment_id` int NOT NULL AUTO_INCREMENT, + `student_id` varchar(255) NOT NULL, + `coach_id` varchar(255) NOT NULL, + `venue_id` int NOT NULL, + `period` varchar(50) NOT NULL, + `status` varchar(50) NOT NULL, + `feedback_id` int DEFAULT NULL, + PRIMARY KEY (`appointment_id`), + KEY `feedback_id` (`feedback_id`), + KEY `idx_appointment_student` (`student_id`), + KEY `idx_appointment_coach` (`coach_id`), + KEY `idx_appointment_venue` (`venue_id`), + KEY `idx_appointment_period` (`period`), + KEY `idx_appointment_status` (`status`), + CONSTRAINT `appointment_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`), + CONSTRAINT `appointment_ibfk_2` FOREIGN KEY (`coach_id`) REFERENCES `coach` (`coach_id`), + CONSTRAINT `appointment_ibfk_3` FOREIGN KEY (`venue_id`) REFERENCES `venue` (`venue_id`), + CONSTRAINT `appointment_ibfk_4` FOREIGN KEY (`feedback_id`) REFERENCES `feedback` (`feedback_id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `appointment` +-- + +LOCK TABLES `appointment` WRITE; +/*!40000 ALTER TABLE `appointment` DISABLE KEYS */; +INSERT INTO `appointment` VALUES (1,'S001','C001',1,'上午','已确认',NULL),(2,'S002','C002',2,'下午','待确认',NULL),(3,'S003','C003',3,'上午','已取消',NULL),(4,'S004','C004',4,'下午','已确认',NULL),(5,'S005','C005',5,'上午','待确认',NULL),(6,'S006','C006',6,'下午','已确认',NULL),(7,'S007','C007',7,'上午','已确认',NULL),(8,'S008','C008',8,'下午','待确认',NULL),(9,'S009','C009',9,'上午','已取消',NULL),(10,'S010','C010',10,'下午','已确认',NULL); +/*!40000 ALTER TABLE `appointment` ENABLE KEYS */; +UNLOCK TABLES; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_appointment_update` AFTER UPDATE ON `appointment` FOR EACH ROW BEGIN + IF OLD.status <> NEW.status THEN + INSERT INTO log (table_name, record_id, action, details) + VALUES ('appointment', NEW.appointment_id, 'update', CONCAT('Status changed from ', OLD.status, ' to ', NEW.status)); + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Temporary view structure for view `appointment_details` +-- + +DROP TABLE IF EXISTS `appointment_details`; +/*!50001 DROP VIEW IF EXISTS `appointment_details`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `appointment_details` AS SELECT + 1 AS `appointment_id`, + 1 AS `student_name`, + 1 AS `coach_name`, + 1 AS `venue_name`, + 1 AS `period`, + 1 AS `status`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `booking_slot` +-- + +DROP TABLE IF EXISTS `booking_slot`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `booking_slot` ( + `slot_id` int NOT NULL AUTO_INCREMENT, + `start_time` time NOT NULL, + `end_time` time NOT NULL, + `venue_id` int NOT NULL, + PRIMARY KEY (`slot_id`), + KEY `venue_id` (`venue_id`), + CONSTRAINT `booking_slot_ibfk_1` FOREIGN KEY (`venue_id`) REFERENCES `venue` (`venue_id`), + CONSTRAINT `booking_slot_chk_1` CHECK ((`end_time` > `start_time`)) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `booking_slot` +-- + +LOCK TABLES `booking_slot` WRITE; +/*!40000 ALTER TABLE `booking_slot` DISABLE KEYS */; +INSERT INTO `booking_slot` VALUES (1,'09:00:00','10:00:00',1),(2,'10:00:00','11:00:00',1),(3,'11:00:00','12:00:00',1),(4,'14:00:00','15:00:00',2),(5,'15:00:00','16:00:00',2),(6,'16:00:00','17:00:00',2),(7,'09:00:00','10:00:00',3),(8,'10:00:00','11:00:00',3),(9,'11:00:00','12:00:00',3),(10,'14:00:00','15:00:00',3); +/*!40000 ALTER TABLE `booking_slot` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `coach` +-- + +DROP TABLE IF EXISTS `coach`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `coach` ( + `coach_id` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `personal_info_id` int DEFAULT NULL, + PRIMARY KEY (`coach_id`), + KEY `personal_info_id` (`personal_info_id`), + KEY `idx_coach_name` (`name`), + CONSTRAINT `coach_ibfk_1` FOREIGN KEY (`personal_info_id`) REFERENCES `personal_info` (`info_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `coach` +-- + +LOCK TABLES `coach` WRITE; +/*!40000 ALTER TABLE `coach` DISABLE KEYS */; +INSERT INTO `coach` VALUES ('C001','王五','coachpass1',3),('C002','赵六','coachpass2',4),('C003','陈翔宇','coachpass3',7),('C004','赵嘉琪','coachpass4',9),('C005','黄涛','coachpass5',NULL),('C006','钱芳','coachpass6',NULL),('C007','朱刚','coachpass7',NULL),('C008','孙莉','coachpass8',NULL),('C009','郑凯','coachpass9',NULL),('C010','林敏','coachpass10',NULL); +/*!40000 ALTER TABLE `coach` ENABLE KEYS */; +UNLOCK TABLES; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_coach_update` AFTER UPDATE ON `coach` FOR EACH ROW BEGIN + IF OLD.name <> NEW.name OR OLD.password <> NEW.password THEN + INSERT INTO log (table_name, record_id, action, details) + VALUES ('coach', NEW.coach_id, 'update', CONCAT('Name or password updated')); + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Temporary view structure for view `coach_details` +-- + +DROP TABLE IF EXISTS `coach_details`; +/*!50001 DROP VIEW IF EXISTS `coach_details`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `coach_details` AS SELECT + 1 AS `coach_id`, + 1 AS `coach_name`, + 1 AS `phone`, + 1 AS `email`, + 1 AS `status`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `feedback` +-- + +DROP TABLE IF EXISTS `feedback`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedback` ( + `feedback_id` int NOT NULL AUTO_INCREMENT, + `content` text NOT NULL, + `date` date NOT NULL, + PRIMARY KEY (`feedback_id`), + KEY `idx_feedback_date` (`date`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `feedback` +-- + +LOCK TABLES `feedback` WRITE; +/*!40000 ALTER TABLE `feedback` DISABLE KEYS */; +INSERT INTO `feedback` VALUES (1,'教练非常耐心,教学很好!','2023-10-01'),(2,'场地设施齐全,体验不错。','2023-10-02'),(3,'课程安排合理,推荐这里学车。','2023-10-03'),(4,'教练态度好,进步很快。','2023-10-04'),(5,'学习氛围浓厚,值得信赖。','2023-10-05'),(6,'教练很专业,感谢指导。','2023-10-06'),(7,'场地干净整洁,感觉舒适。','2023-10-07'),(8,'课程内容丰富,收获颇丰。','2023-10-08'),(9,'教练很有经验,帮助很大。','2023-10-09'),(10,'场地条件优越,性价比高。','2023-10-10'); +/*!40000 ALTER TABLE `feedback` ENABLE KEYS */; +UNLOCK TABLES; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `before_feedback_delete` BEFORE DELETE ON `feedback` FOR EACH ROW BEGIN + DECLARE expiry_date DATE; + SET expiry_date = CURDATE() - INTERVAL 1 YEAR; -- 假设过期时间为一年前 + + IF OLD.date < expiry_date THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'Cannot delete expired feedback'; + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `invoice` +-- + +DROP TABLE IF EXISTS `invoice`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice` ( + `invoice_id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `date` date NOT NULL, + `appointment_id` int DEFAULT NULL, + PRIMARY KEY (`invoice_id`), + KEY `appointment_id` (`appointment_id`), + KEY `idx_invoice_amount` (`amount`), + KEY `idx_invoice_date` (`date`), + CONSTRAINT `invoice_ibfk_1` FOREIGN KEY (`appointment_id`) REFERENCES `appointment` (`appointment_id`), + CONSTRAINT `invoice_chk_1` CHECK ((`amount` >= 0)) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `invoice` +-- + +LOCK TABLES `invoice` WRITE; +/*!40000 ALTER TABLE `invoice` DISABLE KEYS */; +INSERT INTO `invoice` VALUES (1,1500.00,'2023-10-01',1),(2,1800.00,'2023-10-02',2),(3,2000.00,'2023-10-03',3),(4,1700.00,'2023-10-04',4),(5,1600.00,'2023-10-05',5),(6,1900.00,'2023-10-06',6),(7,1400.00,'2023-10-07',7),(8,1550.00,'2023-10-08',8),(9,1650.00,'2023-10-09',9),(10,1750.00,'2023-10-10',10); +/*!40000 ALTER TABLE `invoice` ENABLE KEYS */; +UNLOCK TABLES; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_invoice_insert` AFTER INSERT ON `invoice` FOR EACH ROW BEGIN + UPDATE account + SET status = '已支付' + WHERE account_id = ( + SELECT student_id FROM appointment WHERE appointment_id = NEW.appointment_id + ); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Temporary view structure for view `invoice_details` +-- + +DROP TABLE IF EXISTS `invoice_details`; +/*!50001 DROP VIEW IF EXISTS `invoice_details`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `invoice_details` AS SELECT + 1 AS `invoice_id`, + 1 AS `amount`, + 1 AS `invoice_date`, + 1 AS `student_name`, + 1 AS `coach_name`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `log` +-- + +DROP TABLE IF EXISTS `log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `log` ( + `log_id` int NOT NULL AUTO_INCREMENT, + `table_name` varchar(50) DEFAULT NULL, + `record_id` int DEFAULT NULL, + `action` varchar(50) DEFAULT NULL, + `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `details` text, + PRIMARY KEY (`log_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `log` +-- + +LOCK TABLES `log` WRITE; +/*!40000 ALTER TABLE `log` DISABLE KEYS */; +/*!40000 ALTER TABLE `log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `personal_info` +-- + +DROP TABLE IF EXISTS `personal_info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `personal_info` ( + `info_id` int NOT NULL AUTO_INCREMENT, + `student_id` varchar(255) NOT NULL, + `phone` varchar(20) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + PRIMARY KEY (`info_id`), + UNIQUE KEY `student_id` (`student_id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `personal_info` +-- + +LOCK TABLES `personal_info` WRITE; +/*!40000 ALTER TABLE `personal_info` DISABLE KEYS */; +INSERT INTO `personal_info` VALUES (1,'S001','13800138000','zhangsan@example.com'),(2,'S002','13900139000','lisi@example.com'),(3,'C001','13700137000','wangwu@example.com'),(4,'C002','13600136000','zhaoliu@example.com'),(5,'S003','13500135000','sunbaohua@example.com'),(6,'S004','13400134000','liwenbo@example.com'),(7,'C003','13300133000','chenxiangyu@example.com'),(8,'S005','13200132000','yangming@example.com'),(9,'C004','13100131000','zhaojiaqi@example.com'),(10,'S006','13000130000','wulifei@example.com'); +/*!40000 ALTER TABLE `personal_info` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `student` +-- + +DROP TABLE IF EXISTS `student`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `student` ( + `student_id` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `personal_info_id` int DEFAULT NULL, + PRIMARY KEY (`student_id`), + KEY `personal_info_id` (`personal_info_id`), + KEY `idx_student_name` (`name`), + CONSTRAINT `student_ibfk_1` FOREIGN KEY (`personal_info_id`) REFERENCES `personal_info` (`info_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `student` +-- + +LOCK TABLES `student` WRITE; +/*!40000 ALTER TABLE `student` DISABLE KEYS */; +INSERT INTO `student` VALUES ('S001','张三','studypass1',1),('S002','李四','studypass2',2),('S003','孙宝华','studypass3',5),('S004','李文博','studypass4',6),('S005','杨明','studypass5',8),('S006','吴雷飞','studypass6',10),('S007','刘强','studypass7',NULL),('S008','王丽','studypass8',NULL),('S009','陈杰','studypass9',NULL),('S010','周梅','studypass10',NULL); +/*!40000 ALTER TABLE `student` ENABLE KEYS */; +UNLOCK TABLES; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_student_insert` AFTER INSERT ON `student` FOR EACH ROW BEGIN + INSERT INTO account (account_id, type, status, created_by) + VALUES (NEW.student_id, '学员', '活跃', '张伟'); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Temporary view structure for view `student_appointment_feedback` +-- + +DROP TABLE IF EXISTS `student_appointment_feedback`; +/*!50001 DROP VIEW IF EXISTS `student_appointment_feedback`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `student_appointment_feedback` AS SELECT + 1 AS `student_name`, + 1 AS `coach_name`, + 1 AS `appointment_period`, + 1 AS `appointment_status`, + 1 AS `feedback_content`, + 1 AS `feedback_date`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Temporary view structure for view `student_details` +-- + +DROP TABLE IF EXISTS `student_details`; +/*!50001 DROP VIEW IF EXISTS `student_details`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `student_details` AS SELECT + 1 AS `student_id`, + 1 AS `student_name`, + 1 AS `phone`, + 1 AS `email`, + 1 AS `status`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `training_record` +-- + +DROP TABLE IF EXISTS `training_record`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `training_record` ( + `record_id` int NOT NULL AUTO_INCREMENT, + `student_id` varchar(255) NOT NULL, + `coach_id` varchar(255) NOT NULL, + `feedback` text, + `appointment_id` int DEFAULT NULL, + PRIMARY KEY (`record_id`), + KEY `student_id` (`student_id`), + KEY `coach_id` (`coach_id`), + KEY `appointment_id` (`appointment_id`), + CONSTRAINT `training_record_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`), + CONSTRAINT `training_record_ibfk_2` FOREIGN KEY (`coach_id`) REFERENCES `coach` (`coach_id`), + CONSTRAINT `training_record_ibfk_3` FOREIGN KEY (`appointment_id`) REFERENCES `appointment` (`appointment_id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `training_record` +-- + +LOCK TABLES `training_record` WRITE; +/*!40000 ALTER TABLE `training_record` DISABLE KEYS */; +INSERT INTO `training_record` VALUES (1,'S001','C001','很好的一次训练!',1),(2,'S002','C002','还需要多加练习。',2),(3,'S003','C003','继续保持进步。',3),(4,'S004','C004','表现不错,加油!',4),(5,'S005','C005','需要改进的地方很多。',5),(6,'S006','C006','进步明显,继续努力。',6),(7,'S007','C007','基础还行,还需加强。',7),(8,'S008','C008','整体不错,细节需注意。',8),(9,'S009','C009','还有提升空间。',9),(10,'S010','C010','做得很好,保持下去。',10); +/*!40000 ALTER TABLE `training_record` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `venue` +-- + +DROP TABLE IF EXISTS `venue`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `venue` ( + `venue_id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `capacity` int NOT NULL, + PRIMARY KEY (`venue_id`), + KEY `idx_venue_name` (`name`), + CONSTRAINT `venue_chk_1` CHECK ((`capacity` > 0)) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `venue` +-- + +LOCK TABLES `venue` WRITE; +/*!40000 ALTER TABLE `venue` DISABLE KEYS */; +INSERT INTO `venue` VALUES (1,'训练场A',50),(2,'训练场B',30),(3,'理论教室',40),(4,'模拟驾驶室',20),(5,'休息区',60),(6,'户外练习场',70),(7,'室内练习场',55),(8,'考试中心',25),(9,'培训办公室',10),(10,'接待厅',35); +/*!40000 ALTER TABLE `venue` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Dumping routines for database 'DrivingSchool' +-- +/*!50003 DROP PROCEDURE IF EXISTS `AddNewStudent` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNewStudent`( + IN p_student_id VARCHAR(255), + IN p_name VARCHAR(255), + IN p_password VARCHAR(255), + IN p_phone VARCHAR(20), + IN p_email VARCHAR(255) +) +BEGIN + DECLARE v_info_id INT; + + -- 插入个人基本信息 + INSERT INTO personal_info (phone, email) VALUES (p_phone, p_email); + SET v_info_id = LAST_INSERT_ID(); + + -- 插入学生信息 + INSERT INTO student (student_id, name, password, personal_info_id) + VALUES (p_student_id, p_name, p_password, v_info_id); + + -- 插入账户信息 + INSERT INTO account (account_id, type, status, created_by) + VALUES (p_student_id, '学员', '活跃', '张伟'); +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `CalculateCoachTotalIncome` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculateCoachTotalIncome`( + IN p_coach_id VARCHAR(255) +) +BEGIN + SELECT + c.coach_id, + c.name AS coach_name, + SUM(i.amount) AS total_income + FROM + invoice i + JOIN + appointment ap ON i.appointment_id = ap.appointment_id + JOIN + coach c ON ap.coach_id = c.coach_id + WHERE + c.coach_id = p_coach_id + GROUP BY + c.coach_id, c.name; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `DeleteExpiredInvoices` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `DeleteExpiredInvoices`( + IN p_expiry_date DATE +) +BEGIN + DELETE FROM invoice + WHERE date < p_expiry_date; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `GenerateStudentFeedbackReport` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `GenerateStudentFeedbackReport`( + IN p_student_id VARCHAR(255) +) +BEGIN + SELECT + f.feedback_id, + f.content AS feedback_content, + f.date AS feedback_date + FROM + feedback f + JOIN + training_record tr ON f.feedback_id = tr.feedback_id + WHERE + tr.student_id = p_student_id; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `UpdateAppointmentStatus` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateAppointmentStatus`( + IN p_appointment_id INT, + IN p_new_status VARCHAR(50) +) +BEGIN + UPDATE appointment + SET status = p_new_status + WHERE appointment_id = p_appointment_id; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Final view structure for view `appointment_details` +-- + +/*!50001 DROP VIEW IF EXISTS `appointment_details`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `appointment_details` AS select `ap`.`appointment_id` AS `appointment_id`,`st`.`name` AS `student_name`,`co`.`name` AS `coach_name`,`v`.`name` AS `venue_name`,`ap`.`period` AS `period`,`ap`.`status` AS `status` from (((`appointment` `ap` join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) join `venue` `v` on((`ap`.`venue_id` = `v`.`venue_id`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `coach_details` +-- + +/*!50001 DROP VIEW IF EXISTS `coach_details`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `coach_details` AS select `c`.`coach_id` AS `coach_id`,`c`.`name` AS `coach_name`,`pi`.`phone` AS `phone`,`pi`.`email` AS `email`,`a`.`status` AS `status` from ((`coach` `c` join `personal_info` `pi` on((`c`.`personal_info_id` = `pi`.`info_id`))) join `account` `a` on((`c`.`coach_id` = `a`.`account_id`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `invoice_details` +-- + +/*!50001 DROP VIEW IF EXISTS `invoice_details`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `invoice_details` AS select `i`.`invoice_id` AS `invoice_id`,`i`.`amount` AS `amount`,`i`.`date` AS `invoice_date`,`st`.`name` AS `student_name`,`co`.`name` AS `coach_name` from (((`invoice` `i` join `appointment` `ap` on((`i`.`appointment_id` = `ap`.`appointment_id`))) join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `student_appointment_feedback` +-- + +/*!50001 DROP VIEW IF EXISTS `student_appointment_feedback`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `student_appointment_feedback` AS select `st`.`name` AS `student_name`,`co`.`name` AS `coach_name`,`ap`.`period` AS `appointment_period`,`ap`.`status` AS `appointment_status`,`f`.`content` AS `feedback_content`,`f`.`date` AS `feedback_date` from (((`appointment` `ap` join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) left join `feedback` `f` on((`ap`.`feedback_id` = `f`.`feedback_id`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `student_details` +-- + +/*!50001 DROP VIEW IF EXISTS `student_details`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `student_details` AS select `s`.`student_id` AS `student_id`,`s`.`name` AS `student_name`,`pi`.`phone` AS `phone`,`pi`.`email` AS `email`,`a`.`status` AS `status` from ((`student` `s` join `personal_info` `pi` on((`s`.`personal_info_id` = `pi`.`info_id`))) join `account` `a` on((`s`.`student_id` = `a`.`account_id`))) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2024-12-25 14:58:02 diff --git a/final/insert.sql b/final/insert.sql new file mode 100644 index 0000000..6e93a6d --- /dev/null +++ b/final/insert.sql @@ -0,0 +1,142 @@ +-- Insert ADMIN data +INSERT INTO ADMIN (admin_name, password) VALUES +('Admin1', 'Password1'), +('Admin2', 'Password2'), +('Admin3', 'Password3'), +('Admin4', 'Password4'), +('Admin5', 'Password5'), +('Admin6', 'Password6'), +('Admin7', 'Password7'), +('Admin8', 'Password8'), +('Admin9', 'Password9'), +('Admin10', 'Password10'); + +-- Insert ACCOUNT data +INSERT INTO ACCOUNT (type, status) VALUES +('Coach', 'Active'), +('Student', 'Active'), +('Coach', 'Inactive'), +('Student', 'Inactive'), +('Coach', 'Active'), +('Student', 'Active'), +('Coach', 'Active'), +('Student', 'Active'), +('Coach', 'Inactive'), +('Student', 'Inactive'); + +-- Insert VENUE data +INSERT INTO VENUE (name, capacity) VALUES +('Training Field A', 20), +('Training Field B', 25), +('Theory Classroom 1', 30), +('Theory Classroom 2', 35), +('Rest Room', 15), +('Meeting Room', 10), +('Reception Area', 5), +('Parking Lot', 50), +('Office', 8), +('Storage Room', 10); + +-- Insert STUDENT data +INSERT INTO STUDENT (student_id, name, password) VALUES +(1, 'John Doe', 'StudentPass1'), +(2, 'Jane Smith', 'StudentPass2'), +(3, 'Alice Johnson', 'StudentPass3'), +(4, 'Bob Brown', 'StudentPass4'), +(5, 'Charlie Davis', 'StudentPass5'), +(6, 'Diana Evans', 'StudentPass6'), +(7, 'Ethan Foster', 'StudentPass7'), +(8, 'Fiona Gates', 'StudentPass8'), +(9, 'George Hill', 'StudentPass9'), +(10, 'Hannah Irving', 'StudentPass10'); + +-- Insert COACH data +INSERT INTO COACH (coach_id, name, password) VALUES +(1, 'Mr. Lee', 'CoachPass1'), +(2, 'Mrs. Chen', 'CoachPass2'), +(3, 'Mr. Huang', 'CoachPass3'), +(4, 'Ms. Xu', 'CoachPass4'), +(5, 'Dr. Zhu', 'CoachPass5'), +(6, 'Prof. Jin', 'CoachPass6'), +(7, 'Mr. Lu', 'CoachPass7'), +(8, 'Ms. Liang', 'CoachPass8'), +(9, 'Dr. Shen', 'CoachPass9'), +(10, 'Prof. Han', 'CoachPass10'); + +-- Insert APPOINTMENT data +INSERT INTO APPOINTMENT (student_id, coach_id, venue_id, period, status) VALUES +(1, 1, 1, 'Morning', 'Scheduled'), +(2, 2, 2, 'Afternoon', 'Completed'), +(3, 3, 1, 'Morning', 'Cancelled'), +(4, 4, 3, 'Evening', 'Pending'), +(5, 5, 4, 'Morning', 'In Progress'), +(6, 6, 5, 'Afternoon', 'Completed'), +(7, 7, 1, 'Morning', 'Scheduled'), +(8, 8, 2, 'Afternoon', 'Completed'), +(9, 9, 3, 'Evening', 'Cancelled'), +(10, 10, 4, 'Morning', 'Pending'); + +-- Insert FEEDBACK data +INSERT INTO FEEDBACK (content, date) VALUES +('Very satisfied with the teaching method of the coach.', '2023-10-01'), +('Hope for more practical opportunities.', '2023-10-02'), +('The coach patiently answered my questions.', '2023-10-03'), +('Facility conditions need improvement.', '2023-10-04'), +('Teaching content arrangement is reasonable.', '2023-10-05'), +('Suggest adding interactive segments to theory classes.', '2023-10-06'), +('The coach has a good attitude.', '2023-10-07'), +('Facilities are complete.', '2023-10-08'), +('Hope for more course options.', '2023-10-09'), +('Overall experience is good.', '2023-10-10'); + +-- Insert INVOICE data +INSERT INTO INVOICE (amount, date) VALUES +(500.00, '2023-10-01'), +(600.00, '2023-10-02'), +(550.00, '2023-10-03'), +(700.00, '2023-10-04'), +(650.00, '2023-10-05'), +(500.00, '2023-10-06'), +(600.00, '2023-10-07'), +(550.00, '2023-10-08'), +(700.00, '2023-10-09'), +(650.00, '2023-10-10'); + +-- Insert PERSONAL_INFO data +INSERT INTO PERSONAL_INFO (student_id, phone, email) VALUES +(1, '13800138000', 'johndoe@example.com'), +(2, '13800138001', 'janesmith@example.com'), +(3, '13800138002', 'alicejohnson@example.com'), +(4, '13800138003', 'bobbrown@example.com'), +(5, '13800138004', 'charliedavis@example.com'), +(6, '13800138005', 'dianaevans@example.com'), +(7, '13800138006', 'ethanfoster@example.com'), +(8, '13800138007', 'fiangates@example.com'), +(9, '13800138008', 'georgehill@example.com'), +(10, '13800138009', 'hannahirving@example.com'); + +-- Insert TRAINING_RECORD data +INSERT INTO TRAINING_RECORD (student_id, coach_id, feedback) VALUES +(1, 1, 'The coach is very professional and explains clearly.'), +(2, 2, 'Increased my confidence.'), +(3, 3, 'The facility is nice.'), +(4, 4, 'Will come back next time.'), +(5, 5, 'Made significant progress.'), +(6, 6, 'Looking forward to the next session.'), +(7, 7, 'Thank you, coach.'), +(8, 8, 'Learned a lot.'), +(9, 9, 'Keep it up.'), +(10, 10, 'Trustworthy.'); + +-- Insert BOOKING_SLOT data +INSERT INTO BOOKING_SLOT (start_time, end_time) VALUES +('09:00:00', '10:00:00'), +('10:00:00', '11:00:00'), +('11:00:00', '12:00:00'), +('13:00:00', '14:00:00'), +('14:00:00', '15:00:00'), +('15:00:00', '16:00:00'), +('16:00:00', '17:00:00'), +('17:00:00', '18:00:00'), +('18:00:00', '19:00:00'), +('19:00:00', '20:00:00'); \ No newline at end of file diff --git a/final/procedure.sql b/final/procedure.sql new file mode 100644 index 0000000..1bee5c0 --- /dev/null +++ b/final/procedure.sql @@ -0,0 +1,66 @@ + +-- 添加新学员的存储过程 +CREATE OR REPLACE FUNCTION AddNewStudent( + _student_id VARCHAR(255), + _name VARCHAR(255), + _password VARCHAR(255), + _phone VARCHAR(20), + _email VARCHAR(255) +) RETURNS VOID AS $$ +DECLARE + _info_id INT; +BEGIN + INSERT INTO personal_info (phone, email) VALUES (_phone, _email) RETURNING info_id INTO _info_id; + INSERT INTO student (student_id, name, password, personal_info_id) VALUES (_student_id, _name, _password, _info_id); +END; +$$ LANGUAGE plpgsql; + +-- 更新教练电话的存储过程 +CREATE OR REPLACE FUNCTION UpdateCoachPhone( + _coach_id VARCHAR(255), + _new_phone VARCHAR(20) +) RETURNS VOID AS $$ +BEGIN + UPDATE personal_info SET phone = _new_phone WHERE info_id = (SELECT personal_info_id FROM coach WHERE coach_id = _coach_id); +END; +$$ LANGUAGE plpgsql; + +-- 获取某个学生的所有预约的存储过程 +CREATE OR REPLACE FUNCTION GetStudentAppointments( + _student_id VARCHAR(255) +) RETURNS TABLE(appointment_id INT, coach_name VARCHAR(255), venue_name VARCHAR(255), period VARCHAR(50), status VARCHAR(50)) AS $$ +BEGIN + RETURN QUERY + SELECT a.appointment_id, c.name AS coach_name, v.name AS venue_name, a.period, a.status + FROM appointment a + JOIN coach c ON a.coach_id = c.coach_id + JOIN venue v ON a.venue_id = v.venue_id + WHERE a.student_id = _student_id; +END; +$$ LANGUAGE plpgsql; + +-- 获取某个教练的所有反馈的存储过程 +CREATE OR REPLACE FUNCTION GetCoachFeedbacks( + _coach_id VARCHAR(255) +) RETURNS TABLE(feedback_id INT, content TEXT, date DATE) AS $$ +BEGIN + RETURN QUERY + SELECT f.feedback_id, f.content, f.date + FROM feedback f + JOIN training_record t ON f.feedback_id = t.feedback_id + WHERE t.coach_id = _coach_id; +END; +$$ LANGUAGE plpgsql; + +-- 获取某个场地的所有可用时间段的存储过程 +CREATE OR REPLACE FUNCTION GetAvailableSlotsForVenue( + _venue_id INT +) RETURNS TABLE(slot_id INT, start_time TIME, end_time TIME) AS $$ +BEGIN + RETURN QUERY + SELECT bs.slot_id, bs.start_time, bs.end_time + FROM booking_slot bs + LEFT JOIN appointment a ON bs.venue_id = a.venue_id AND bs.start_time <= a.period::time AND bs.end_time >= a.period::time + WHERE bs.venue_id = _venue_id AND a.appointment_id IS NULL; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/final/search.sql b/final/search.sql new file mode 100644 index 0000000..f0f54d9 --- /dev/null +++ b/final/search.sql @@ -0,0 +1,118 @@ +-- 比较条件 + +-- 查询所有活跃状态的学生 +SELECT * +FROM student +WHERE account_id IN ( + SELECT account_id + FROM account + WHERE status = '活跃' +); + +-- 查询所有非管理员账户 +SELECT * +FROM account +WHERE type <> '管理员'; + +-- 集合比较 + +-- 查询在多个场地有过预约的学生 +SELECT s.student_id, s.name +FROM student s +JOIN appointment a ON s.student_id = a.student_id +GROUP BY s.student_id, s.name +HAVING COUNT(DISTINCT a.venue_id) > 1; + +-- 查询同时是教练和学生的人员 +SELECT p.info_id, p.phone, p.email +FROM personal_info p +WHERE p.info_id IN (SELECT student_id FROM student) +AND p.info_id IN (SELECT personal_info_id FROM coach); + +-- 范围比较 + +-- 查询2023年10月1日到2023年10月31日期间的反馈 +SELECT * +FROM feedback +WHERE date BETWEEN '2023-10-01' AND '2023-10-31'; + +-- 查询容量大于50的场地 +SELECT * +FROM venue +WHERE capacity > 50; + +-- 字符串相似比较 + +-- 查询名字以“张”开头的学生 +SELECT * +FROM student +WHERE name LIKE '张%'; + +-- 查询电子邮件包含“example.com”的个人信息 +SELECT * +FROM personal_info +WHERE email LIKE '%example.com%'; + +-- 多表连接 + +-- 查询每个学生的最新反馈 +SELECT f.feedback_id, f.content, f.date, s.student_id, s.name +FROM feedback f +JOIN training_record tr ON f.feedback_id = tr.feedback_id +JOIN student s ON tr.student_id = s.student_id +WHERE (s.student_id, f.date) IN ( + SELECT student_id, MAX(date) + FROM feedback f2 + JOIN training_record tr2 ON f2.feedback_id = tr2.feedback_id + GROUP BY student_id +); + +-- 查询每个教练负责的所有学生 +SELECT c.coach_id, c.name AS coach_name, s.student_id, s.name AS student_name +FROM coach c +JOIN appointment a ON c.coach_id = a.coach_id +JOIN student s ON a.student_id = s.student_id +ORDER BY c.coach_id, s.student_id; + +-- 嵌套查询 + +-- 查询有超过一次预约的学生 +SELECT student_id, name +FROM student +WHERE student_id IN ( + SELECT student_id + FROM appointment + GROUP BY student_id + HAVING COUNT(*) > 1 +); + +-- 查询没有任何反馈的预约 +SELECT * +FROM appointment +WHERE appointment_id NOT IN ( + SELECT appointment_id + FROM feedback +); + +-- EXISTS 查询 + +-- 查询有预约记录的学生 +SELECT * +FROM student s +WHERE EXISTS ( + SELECT 1 + FROM appointment a + WHERE a.student_id = s.student_id +); + +-- 查询有训练记录的教练 +SELECT * +FROM coach c +WHERE EXISTS ( + SELECT 1 + FROM training_record tr + WHERE tr.coach_id = c.coach_id +); + + + diff --git a/final/security.sql b/final/security.sql new file mode 100644 index 0000000..268de18 --- /dev/null +++ b/final/security.sql @@ -0,0 +1,42 @@ +-- 创建用户并设置密码 +CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'AdminPass'; +CREATE USER 'coach_user'@'localhost' IDENTIFIED BY 'CoachPass'; +CREATE USER 'student_user'@'localhost' IDENTIFIED BY 'StudentPass'; + +-- 授予管理员权限 +GRANT ALL PRIVILEGES ON fitness_center.* TO 'admin_user'@'localhost'; + +-- 创建视图供教练使用 +CREATE VIEW coach_appointments AS +SELECT * FROM APPOINTMENT WHERE coach_id = SUBSTRING_INDEX(USER(), '@', 1); + +CREATE VIEW coach_training_records AS +SELECT * FROM TRAINING_RECORD WHERE coach_id = SUBSTRING_INDEX(USER(), '@', 1); + +-- 授予教练权限 +GRANT SELECT, INSERT ON fitness_center.FEEDBACK TO 'coach_user'@'localhost'; +GRANT SELECT, UPDATE ON fitness_center.coach_appointments TO 'coach_user'@'localhost'; +GRANT SELECT ON fitness_center.STUDENT TO 'coach_user'@'localhost'; +GRANT SELECT ON fitness_center.coach_training_records TO 'coach_user'@'localhost'; + +-- 创建视图供学生使用 +CREATE VIEW student_appointments AS +SELECT * FROM APPOINTMENT WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1); + +CREATE VIEW student_personal_info AS +SELECT * FROM PERSONAL_INFO WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1); + +CREATE VIEW student_training_records AS +SELECT * FROM TRAINING_RECORD WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1); + +-- 授予学生权限 +GRANT SELECT, INSERT ON fitness_center.FEEDBACK TO 'student_user'@'localhost'; +GRANT SELECT, UPDATE ON fitness_center.student_appointments TO 'student_user'@'localhost'; +GRANT SELECT ON fitness_center.student_personal_info TO 'student_user'@'localhost'; +GRANT SELECT ON fitness_center.student_training_records TO 'student_user'@'localhost'; + +-- 刷新权限 +FLUSH PRIVILEGES; + + + diff --git a/final/trigger.sql b/final/trigger.sql new file mode 100644 index 0000000..780490f --- /dev/null +++ b/final/trigger.sql @@ -0,0 +1,60 @@ +-- 当插入新的学生时,自动在personal_info表中插入一条记录 +CREATE OR REPLACE FUNCTION InsertPersonalInfoOnStudentInsert() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO personal_info (phone, email) VALUES ('', ''); + NEW.personal_info_id := currval('personal_info_info_id_seq'); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_insert_personal_info_on_student_insert +BEFORE INSERT ON student +FOR EACH ROW EXECUTE FUNCTION InsertPersonalInfoOnStudentInsert(); + +-- 当删除一个教练时,自动删除其关联的personal_info记录 +CREATE OR REPLACE FUNCTION DeletePersonalInfoOnCoachDelete() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM personal_info WHERE info_id = OLD.personal_info_id; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_delete_personal_info_on_coach_delete +AFTER DELETE ON coach +FOR EACH ROW EXECUTE FUNCTION DeletePersonalInfoOnCoachDelete(); + +-- 当插入新的预约时,检查是否已经有重叠的时间段 +CREATE OR REPLACE FUNCTION CheckOverlapBeforeAppointmentInsert() +RETURNS TRIGGER AS $$ +DECLARE + overlap_count INT; +BEGIN + SELECT COUNT(*) INTO overlap_count + FROM appointment a + WHERE a.venue_id = NEW.venue_id + AND ((a.period = NEW.period) + OR (a.period < NEW.period AND a.period + INTERVAL '1 hour' > NEW.period) + OR (a.period > NEW.period AND a.period < NEW.period + INTERVAL '1 hour')); + IF overlap_count > 0 THEN + RAISE EXCEPTION 'There is an overlapping appointment at the same time and place.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_check_overlap_before_appointment_insert +BEFORE INSERT ON appointment +FOR EACH ROW EXECUTE FUNCTION CheckOverlapBeforeAppointmentInsert(); + +-- 当更新发票金额时,确保金额不小于零 +CREATE OR REPLACE FUNCTION EnsureInvoiceAmountNonNegative() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.amount < 0 THEN + RAISE EXCEPTION 'Invoice amount cannot be negative.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; diff --git a/final/update.sql b/final/update.sql new file mode 100644 index 0000000..c56e3f0 --- /dev/null +++ b/final/update.sql @@ -0,0 +1,89 @@ +-- 更新学生的电话号码 +UPDATE personal_info +SET phone = '13800138001' +WHERE student_id = 'S001'; + +-- 更新教练的电子邮件 +UPDATE personal_info +SET email = 'wangwu_new@example.com' +WHERE info_id = ( + SELECT personal_info_id FROM coach WHERE coach_id = 'C001' +); + +-- 更新预约的状态 +UPDATE appointment +SET status = '已完成' +WHERE appointment_id = 1; + +-- 更新场地的容量 +UPDATE venue +SET capacity = 60 +WHERE venue_id = 1; + +-- 更新反馈的内容 +UPDATE feedback +SET content = '非常好的一次训练体验!' +WHERE feedback_id = 1; + +-- 更新发票的金额 +UPDATE invoice +SET amount = 1600.00 +WHERE invoice_id = 1; + +-- 更新训练记录的反馈内容 +UPDATE training_record +SET feedback = '继续保持进步!' +WHERE record_id = 1; + +-- 更新账户的状态 +UPDATE account +SET status = '停用' +WHERE account_id = 'S001'; + +-- 更新预约的时间段 +UPDATE appointment +SET period = '下午' +WHERE appointment_id = 2; + +-- 更新教练的密码 +UPDATE coach +SET password = 'newcoachpass2' +WHERE coach_id = 'C002'; + +-- 删除特定的学生 +DELETE FROM student WHERE student_id = 'S007'; +DELETE FROM personal_info WHERE student_id = 'S007'; +DELETE FROM account WHERE account_id = 'S007'; + +-- 删除特定的教练 +DELETE FROM coach WHERE coach_id = 'C007'; +DELETE FROM personal_info WHERE info_id = ( + SELECT personal_info_id FROM coach WHERE coach_id = 'C007' +); +DELETE FROM account WHERE account_id = 'C007'; + +-- 删除特定的预约 +DELETE FROM appointment WHERE appointment_id = 3; + +-- 删除特定的场地 +DELETE FROM venue WHERE venue_id = 6; + +-- 删除特定的反馈 +DELETE FROM feedback WHERE feedback_id = 5; + +-- 删除特定的发票 +DELETE FROM invoice WHERE invoice_id = 6; +-- 删除特定的训练记录 +DELETE FROM training_record WHERE record_id = 7; + +-- 删除特定的账户 +DELETE FROM account WHERE account_id = 'S007'; + +-- 删除特定的预约时间段 +DELETE FROM booking_slot WHERE slot_id = 8; + +-- 删除特定的个人基本信息 +DELETE FROM personal_info WHERE info_id = 7; + + + diff --git a/final/高级语言.py b/final/高级语言.py new file mode 100644 index 0000000..d42a339 --- /dev/null +++ b/final/高级语言.py @@ -0,0 +1,336 @@ +import mysql.connector +from mysql.connector import Error + +# 数据库配置信息 +config = { + 'user': 'root', + 'password': '123456', + 'host': 'localhost', + 'database': 'drivingschool', + 'raise_on_warnings': True +} +# 连接数据库 +def connect_to_db(config): + try: + connection = mysql.connector.connect(**config) + return connection + except Error as e: + print(f"The error '{e}' occurred") + +# 断开数据库连接 +def close_db_connection(connection): + if connection.is_connected(): + connection.close() + +# 添加新学生 +def add_new_student(connection, student_id, name, password, phone, email): + cursor = connection.cursor() + query = """ + CALL AddNewStudent(%s, %s, %s, %s, %s) + """ + cursor.execute(query, (student_id, name, password, phone, email)) + connection.commit() + cursor.close() + +# 更新预约状态 +def update_appointment_status(connection, appointment_id, new_status): + cursor = connection.cursor() + query = """ + CALL UpdateAppointmentStatus(%s, %s) + """ + cursor.execute(query, (appointment_id, new_status)) + connection.commit() + cursor.close() + +# 查询学生详细信息 +def get_student_details(connection, student_id): + cursor = connection.cursor() + query = """ + SELECT * FROM student_details WHERE student_id = %s + """ + cursor.execute(query, (student_id,)) + result = cursor.fetchone() + cursor.close() + return result + +# 查询教练详细信息 +def get_coach_details(connection, coach_id): + cursor = connection.cursor() + query = """ + SELECT * FROM coach_details WHERE coach_id = %s + """ + cursor.execute(query, (coach_id,)) + result = cursor.fetchone() + cursor.close() + return result + +# 查询预约详细信息 +def get_appointment_details(connection, appointment_id): + cursor = connection.cursor() + query = """ + SELECT * FROM appointment_details WHERE appointment_id = %s + """ + cursor.execute(query, (appointment_id,)) + result = cursor.fetchone() + cursor.close() + return result + +# 查询训练记录详细信息 +def get_training_record_details(connection, record_id): + cursor = connection.cursor() + query = """ + SELECT * FROM training_record_view WHERE record_id = %s + """ + cursor.execute(query, (record_id,)) + result = cursor.fetchone() + cursor.close() + return result + +# 查询发票详细信息 +def get_invoice_details(connection, invoice_id): + cursor = connection.cursor() + query = """ + SELECT * FROM invoice_details WHERE invoice_id = %s + """ + cursor.execute(query, (invoice_id,)) + result = cursor.fetchone() + cursor.close() + return result + +# 查询所有学生详细信息 +def get_all_students(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM student_details + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有教练详细信息 +def get_all_coaches(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM coach_details + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有预约详细信息 +def get_all_appointments(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM appointment_details + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有训练记录详细信息 +def get_all_training_records(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM training_record_view + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有发票详细信息 +def get_all_invoices(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM invoice_details + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有反馈 +def get_all_feedback(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM feedback + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +# 查询所有日志 +def get_all_logs(connection): + cursor = connection.cursor() + query = """ + SELECT * FROM log + """ + cursor.execute(query) + results = cursor.fetchall() + cursor.close() + return results + +def delete_student(connection, student_id): + """删除学生""" + cursor = connection.cursor() + query = """ + DELETE FROM students WHERE student_id = %s + """ + try: + cursor.execute(query, (student_id,)) + connection.commit() + print("学生删除成功") + except Error as e: + print(f"删除学生时出错: {e}") + connection.rollback() + finally: + cursor.close() +# 根据用户输入执行不同的操作 +def update_student(connection, student_id, name=None, password=None, phone=None, email=None): + """更新学生信息""" + cursor = connection.cursor() + updates = [] + params = [student_id] + + if name is not None: + updates.append("name=%s") + params.insert(0, name) + if password is not None: + updates.append("password=%s") + params.insert(1, password) + if phone is not None: + updates.append("phone=%s") + params.insert(2, phone) + if email is not None: + updates.append("email=%s") + params.insert(3, email) + + if updates: + query = f"UPDATE students SET {', '.join(updates)} WHERE student_id=%s" + try: + cursor.execute(query, tuple(params)) + connection.commit() + print("学生信息更新成功") + except Error as e: + print(f"更新学生信息时出错: {e}") + connection.rollback() + finally: + cursor.close() + else: + print("没有提供要更新的信息") +def main(): + connection = connect_to_db(config) + if connection is not None: + while True: + print("\n1. 添加新学生") + print("2. 更新预约状态") + print("3. 查询学生详细信息") + print("4. 查询教练详细信息") + print("5. 查询预约详细信息") + print("6. 查询训练记录详细信息") + print("7. 查询发票详细信息") + print("8. 查询所有学生详细信息") + print("9. 查询所有教练详细信息") + print("10. 查询所有预约详细信息") + print("11. 查询所有训练记录详细信息") + print("12. 查询所有发票详细信息") + print("13. 查询所有反馈") + print("14. 查询所有日志") + print("15. 删除学生") + print("16. 更新学生信息") + print("17. 退出") + choice = input("请选择一个操作:") + + if choice == '1': + student_id = input("输入学生ID:") + name = input("输入学生姓名:") + password = input("输入学生密码:") + phone = input("输入学生电话:") + email = input("输入学生邮箱:") + add_new_student(connection, student_id, name, password, phone, email) + print("新学生添加成功。") + elif choice == '2': + appointment_id = int(input("输入预约ID:")) + new_status = input("输入新的预约状态:") + update_appointment_status(connection, appointment_id, new_status) + print("预约状态更新成功。") + elif choice == '3': + student_id = input("输入学生ID:") + details = get_student_details(connection, student_id) + print("学生详细信息:", details) + elif choice == '4': + coach_id = input("输入教练ID:") + details = get_coach_details(connection, coach_id) + print("教练详细信息:", details) + elif choice == '5': + appointment_id = int(input("输入预约ID:")) + details = get_appointment_details(connection, appointment_id) + print("预约详细信息:", details) + elif choice == '6': + record_id = int(input("输入训练记录ID:")) + details = get_training_record_details(connection, record_id) + print("训练记录详细信息:", details) + elif choice == '7': + invoice_id = int(input("输入发票ID:")) + details = get_invoice_details(connection, invoice_id) + print("发票详细信息:", details) + elif choice == '8': + all_students = get_all_students(connection) + print("所有学生详细信息:") + for student in all_students: + print(student) + elif choice == '9': + all_coaches = get_all_coaches(connection) + print("所有教练详细信息:") + for coach in all_coaches: + print(coach) + elif choice == '10': + all_appointments = get_all_appointments(connection) + print("所有预约详细信息:") + for appointment in all_appointments: + print(appointment) + elif choice == '11': + all_training_records = get_all_training_records(connection) + print("所有训练记录详细信息:") + for record in all_training_records: + print(record) + elif choice == '12': + all_invoices = get_all_invoices(connection) + print("所有发票详细信息:") + for invoice in all_invoices: + print(invoice) + elif choice == '13': + all_feedback = get_all_feedback(connection) + print("所有反馈:") + for feedback in all_feedback: + print(feedback) + elif choice == '14': + all_logs = get_all_logs(connection) + print("所有日志:") + for log in all_logs: + print(log) + elif choice == '15': + student_id = input("输入要删除的学生ID:") + print("删除成功") + elif choice == '16': + student_id = input("输入要更新的学生ID:") + name = input("输入新的学生姓名 (留空则不更改): ") or None + password = input("输入新的学生密码 (留空则不更改): ") or None + phone = input("输入新的学生电话 (留空则不更改): ") or None + email = input("输入新的学生邮箱 (留空则不更改): ") or None + print("学生信息已更新") + elif choice == '17': + break + else: + print("无效的选择,请重新输入。") + + close_db_connection(connection) + + close_db_connection(connection) + +if __name__ == "__main__": + main() \ No newline at end of file