学生宿舍管理系统oracle
用户表:编号,用户名,密码,邮箱,角色,用户头像;
影片表:编号,影片名称,国外名称,演职人员,导演,电影详情,电影时长,电影类型,电影评分,票房,电影参评人数,上映时间,制片地区,电影海报地址,电影状态;
影院表:编号,影院名称,影院地址;
放映厅表:编号,放映厅名称,放映厅容量,所属影院编号;
订单表:编号,所属用户编号,所属场次编号,电影票座位信息,订单状态,订单价格,订单支付时间,所属用户对象;
订单详情表:编号,所属放映厅,放映的电影编号,电影放映时间,售价,剩余座位数,场次状态,所属放映厅对象,放映的电影;
评论表:编号,所属用户编号,评论内容,所属电影编号,评论时间,所属用户,评分;
影院票务管理系统
| 姓名 | 主要完成的工作 | 备注 |
|---|---|---|
1. 需求分析
1.1. 用户管理模块
在整体设计中,我们将宿舍管理系统分为五个大的功能:系统管理功能、公寓管理功能、信息查询功能、出入登记功能、信息修改功能。下面将具体进行介绍每个功能。
(1)系统管理功能
系统管理功能包括:用户登录、用户密码修改、用户管理、退出系统五个部分。
(2)公寓管理功能
公寓管理功能包括:楼房管理、宿舍管理、员工管理三个大的部分。
(3)信息查询功能
信息查询功能基本上包括:按学号进行查询、按姓名进行查询、按班级查询、按寝室号查询、每栋楼房住宿情况查询五个部分。
(4)出入登记功能
出入登记功能包括:进楼物品登记、出楼物品登记、人员来访登记、结束访问登记四个功能部分。
(5)信息修改功能
信息修改功能包括:学生基本信息修改、员工基本信息修改等。除了以上项目外,整个系统还包括登陆管理,即根据不同人员的身份合法性认证,使其进行相应的操作。人员分普通用户、管理员。
2. 系统设计
2.1. 系统结构功能图
根据需求分析,确定系统结构功能如图2-1所示:

图2-1 系统功能结构图
2.2. 功能流程图
系统最主要的功能就是管理员登录之后对各种功能的使用。管理员功能如图4-2所示。

图2-2 管理员登录管理流程
2.3. 数据库设计
整体功能的E-R图如图2-4所示。

图2-4 系统E-R图
本系统包含的数据表如下:
1**书架类型表** (shelf_types)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| shelf_type_id | NUMBER | 主键 | - | 否 | - | 书架类型ID |
| shelf_type_name | VARCHAR2 | 非空 | 50 | 否 | - | 书架类型名称 |
2**读者类型表** (reader_types)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| reader_type_id | NUMBER | 主键 | - | 否 | - | 读者类型ID |
| reader_type_name | VARCHAR2 | 非空 | 50 | 否 | - | 读者类型名称 |
3**书架表** (shelves)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| shelf_id | NUMBER | 主键 | - | 否 | - | 书架ID |
| shelf_number | VARCHAR2 | 非空 | 20 | 否 | - | 书架编号 |
| shelf_type_id | NUMBER | 外键且非空 | - | 否 | - | 书架类型ID |
4**工作人员表** (staff)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| staff_id | NUMBER | 主键 | - | 否 | - | 工作人员ID |
| staff_name | VARCHAR2 | 非空 | 100 | 否 | - | 工作人员姓名 |
| staff_position | VARCHAR2 | 非空 | 50 | 否 | - | 工作人员职位 |
5**图书表** (books)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| book_id | NUMBER | 主键 | - | 否 | - | 图书ID |
| title | VARCHAR2 | 非空 | 200 | 否 | - | 图书标题 |
| author | VARCHAR2 | 非空 | 100 | 否 | - | 图书作者 |
| isbn | VARCHAR2 | 唯一且非空 | 20 | 否 | - | 图书国际标准书号 |
| publication_year | NUMBER | 可空 | - | 是 | - | 出版年份 |
| shelf_id | NUMBER | 外键且非空 | - | 否 | - | 书架ID |
6**读者表** (readers)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| reader_id | NUMBER | 主键 | - | 否 | - | 读者ID |
| reader_name | VARCHAR2 | 非空 | 100 | 否 | - | 读者姓名 |
| reader_type_id | NUMBER | 外键且非空 | - | 否 | - | 读者类型ID |
| contact_phone | VARCHAR2 | 可空 | 15 | 是 | - | 联系电话 |
7**正借阅表** (loans)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| loan_id | NUMBER | 主键 | - | 否 | - | 借阅记录ID |
| book_id | NUMBER | 外键且非空 | - | 否 | - | 图书ID |
| reader_id | NUMBER | 外键且非空 | - | 否 | - | 读者ID |
| loan_date | DATE | 非空 | - | 否 | - | 借书日期 |
| due_date | DATE | 非空 | - | 否 | - | 应还日期 |
8**已还书籍表** (returns)
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| return_id | NUMBER | 主键 | - | 否 | - | 还书记录ID |
| loan_id | NUMBER | 外键 | - | 是 | - | 借阅记录ID |
| return_date | DATE | 非空 | - | 否 | - | 还书日期 |
9**通知记录表(overdue_notifications)**
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| notification_id | NUMBER | 主键 | - | 否 | - | 通知记录 |
| loan_id | NUMBER | 外键 | - | 否 | - | 借阅记录 ID |
| reader_id | NUMBER | 外键 | - | 否 | - | 读者 ID |
| notification_date | DATE | 日期 | - | 是 | SYSDATE | 通知日期 |
| message | VARCHAR2 | 字符串 | 500 | 是 | - | 通知内容 |
10**历史记录表(book_location_history)**
| 列名 | 数据类型 | 字段类型 | 长度 | 是否为空 | 默认值 | 备注 |
|---|---|---|---|---|---|---|
| history_id | NUMBER | 主键 | - | 否 | - | 历史记录 |
| book_id | NUMBER | 外键 | - | 否 | - | 图书 ID |
| old_shelf_id | NUMBER | 外键 | - | 是 | - | 旧书架 ID |
| new_shelf_id | NUMBER | 外键 | - | 否 | - | 新书架 ID |
| change_date | DATE | 日期 | - | 是 | SYSDATE | 变更日期 |
| changed_by | NUMBER | 外键 | - | 是 | - | 操作人 ID |
3. SQL实现
3.1. 建表
|
3.2. 索引
|
3.3. 视图
|
— 3. 访客登记详情视图
CREATE OR REPLACE VIEW vw_visitor_records AS
SELECT
v.visit_id,
v.visitor_name,
s.student_id,
s.name AS student_name,
b.building_name,
v.enter_time,
v.leave_time,
st.name AS reception_staff,
— 使用SYSDATE简化计算
ROUND(
(
COALESCE(CAST(v.leave_time AS DATE), SYSDATE)
-
CAST(v.enter_time AS DATE)
) * 24 * 60
) AS duration_minutes,
CASE
WHEN v.leave_time IS NULL THEN '访问中'
ELSE '已离开'
END AS visit_status
FROM visitor_registrations v
JOIN students s ON v.student_id = s.student_id
JOIN buildings b ON v.building_id = b.building_id
JOIN staff st ON v.staff_id = st.staff_id;
— 4. 物品进出记录视图
CREATE VIEW system_log_info AS
SELECT
sl.log_id,
u.user_id,
u.role,
sl.operation,
sl.op_time
FROM
system_log sl
JOIN
system_users u ON sl.user_id = u.user_id;
— 5. 宿舍空位视图
CREATE VIEW vw_available_beds AS
SELECT
d.room_id,
b.building_name,
d.room_type,
d.capacity,
d.current_count,
(d.capacity - d.current_count) AS available_beds
FROM dorm_rooms d
JOIN buildings b ON d.building_id = b.building_id
WHERE d.current_count < d.capacity;
— 6. 员工负责楼栋视图
CREATE VIEW vw_staff_responsibilities AS
SELECT
s.staff_id,
s.name AS staff_name,
s.position,
s.contact,
b.building_id,
b.building_name,
COUNT(d.room_id) AS rooms_managed
FROM staff s
LEFT JOIN buildings b ON s.building_id = b.building_id
LEFT JOIN dorm_rooms d ON b.building_id = d.building_id
GROUP BY s.staff_id, s.name, s.position, s.contact, b.building_id, b.building_name;
## 存储过程、函数
```sql
-- 1. 用户管理相关
--# 1.1 用户登录验证函数
CREATE OR REPLACE FUNCTION fn_user_login(
p_user_id IN VARCHAR2,
p_password IN VARCHAR2
) RETURN VARCHAR2
IS
v_role VARCHAR2(10);
BEGIN
SELECT role INTO v_role
FROM system_users
WHERE user_id = p_user_id AND password = p_password;
RETURN v_role;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'FAILURE';
END;
/
--# 1.2 修改密码存储过程
CREATE OR REPLACE PROCEDURE sp_change_password(
p_user_id IN VARCHAR2,
p_old_password IN VARCHAR2,
p_new_password IN VARCHAR2
)
IS
BEGIN
UPDATE system_users
SET password = p_new_password
WHERE user_id = p_user_id AND password = p_old_password;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20001, '原密码错误或用户不存在');
END IF;
END;
/
-- 2. 公寓管理相关
--# 2.1 添加新公寓楼存储过程
CREATE OR REPLACE PROCEDURE sp_add_building(
p_building_id IN VARCHAR2,
p_building_name IN VARCHAR2
)
IS
BEGIN
INSERT INTO buildings (building_id, building_name)
VALUES (p_building_id, p_building_name);
-- 记录操作日志
sp_log_operation('system', '添加新公寓楼: ' || p_building_name);
END;
/
--# 2.2 分配楼管员存储过程
CREATE OR REPLACE PROCEDURE sp_assign_building_manager(
p_building_id IN VARCHAR2,
p_staff_id IN VARCHAR2
)
IS
v_manager_exists NUMBER;
BEGIN
-- 检查员工是否存在
SELECT COUNT(*) INTO v_manager_exists
FROM staff
WHERE staff_id = p_staff_id;
IF v_manager_exists = 0 THEN
RAISE_APPLICATION_ERROR(-20002, '员工不存在');
END IF;
-- 更新楼栋管理员
UPDATE buildings
SET manager_id = p_staff_id
WHERE building_id = p_building_id;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20003, '楼栋不存在');
END IF;
END;
/
-- 3. 宿舍管理相关
--# 3.1 添加宿舍房间存储过程
CREATE OR REPLACE PROCEDURE sp_add_dorm_room(
p_room_id IN VARCHAR2,
p_building_id IN VARCHAR2,
p_capacity IN NUMBER DEFAULT 4,
p_room_type IN VARCHAR2 DEFAULT '标准间'
)
IS
BEGIN
INSERT INTO dorm_rooms (room_id, building_id, room_type, capacity)
VALUES (p_room_id, p_building_id, p_room_type, p_capacity);
-- 更新楼栋房间总数
UPDATE buildings
SET total_rooms = total_rooms + 1
WHERE building_id = p_building_id;
END;
/
--# 3.2 分配学生到宿舍存储过程
CREATE OR REPLACE PROCEDURE sp_assign_student_to_room(
p_student_id IN VARCHAR2,
p_room_id IN VARCHAR2
)
IS
v_available_beds NUMBER;
BEGIN
-- 检查宿舍是否有空位
SELECT available_beds INTO v_available_beds
FROM vw_available_beds
WHERE room_id = p_room_id;
IF v_available_beds <= 0 THEN
RAISE_APPLICATION_ERROR(-20004, '该宿舍已满员');
END IF;
-- 分配宿舍
UPDATE students
SET room_id = p_room_id
WHERE student_id = p_student_id;
-- 更新宿舍当前人数
UPDATE dorm_rooms
SET current_count = current_count + 1
WHERE room_id = p_room_id;
END;
/
-- 4. 出入登记相关
--# 4.1 访客登记存储过程
CREATE OR REPLACE PROCEDURE sp_register_visitor(
p_visitor_name IN VARCHAR2,
p_student_id IN VARCHAR2,
p_building_id IN VARCHAR2,
p_staff_id IN VARCHAR2
)
IS
BEGIN
INSERT INTO visitor_registrations (visitor_name, student_id, building_id, staff_id)
VALUES (p_visitor_name, p_student_id, p_building_id, p_staff_id);
END;
/
--# 4.2 结束访问登记存储过程
CREATE OR REPLACE PROCEDURE sp_end_visit(
p_visit_id IN NUMBER
)
IS
BEGIN
UPDATE visitor_registrations
SET leave_time = SYSTIMESTAMP
WHERE visit_id = p_visit_id;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20005, '访问记录不存在');
END IF;
END;
/
--# 4.3 物品进出登记存储过程
CREATE OR REPLACE PROCEDURE sp_register_item(
p_student_id IN VARCHAR2,
p_item_name IN VARCHAR2,
p_direction IN VARCHAR2,
p_staff_id IN VARCHAR2,
p_quantity IN NUMBER DEFAULT 1
)
IS
BEGIN
INSERT INTO item_registrations (student_id, item_name, direction, staff_id, quantity)
VALUES (p_student_id, p_item_name, p_direction, p_staff_id, p_quantity);
END;
/
-- 5. 信息查询相关函数
--# 5.1 查询学生住宿信息函数
CREATE OR REPLACE FUNCTION fn_get_student_info(
p_search_key IN VARCHAR2,
p_search_type IN VARCHAR2 -- 'ID', 'NAME', 'CLASS', 'ROOM'
) RETURN SYS_REFCURSOR
IS
v_cursor SYS_REFCURSOR;
BEGIN
CASE p_search_type
WHEN 'ID' THEN
OPEN v_cursor FOR
SELECT * FROM vw_student_dorm_details
WHERE student_id = p_search_key;
WHEN 'NAME' THEN
OPEN v_cursor FOR
SELECT * FROM vw_student_dorm_details
WHERE student_name LIKE '%' || p_search_key || '%';
WHEN 'CLASS' THEN
OPEN v_cursor FOR
SELECT * FROM vw_student_dorm_details
WHERE class_name = p_search_key;
WHEN 'ROOM' THEN
OPEN v_cursor FOR
SELECT * FROM vw_student_dorm_details
WHERE room_id = p_search_key;
ELSE
RAISE_APPLICATION_ERROR(-20006, '无效的查询类型');
END CASE;
RETURN v_cursor;
END;
/
--# 5.2 获取楼栋入住率函数
CREATE OR REPLACE FUNCTION fn_get_building_occupancy(
p_building_id IN VARCHAR2
) RETURN NUMBER
IS
v_occupancy_rate NUMBER;
BEGIN
SELECT occupancy_rate INTO v_occupancy_rate
FROM vw_building_occupancy
WHERE building_id = p_building_id;
RETURN v_occupancy_rate;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
/
-- 6. 信息修改相关
--# 6.1 修改学生基本信息存储过程
CREATE OR REPLACE PROCEDURE sp_update_student_info(
p_student_id IN VARCHAR2,
p_name IN VARCHAR2 DEFAULT NULL,
p_gender IN CHAR DEFAULT NULL,
p_class_name IN VARCHAR2 DEFAULT NULL,
p_room_id IN VARCHAR2 DEFAULT NULL
)
IS
BEGIN
UPDATE students
SET
name = COALESCE(p_name, name),
gender = COALESCE(p_gender, gender),
class_name = COALESCE(p_class_name, class_name),
room_id = COALESCE(p_room_id, room_id)
WHERE student_id = p_student_id;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20007, '学生不存在');
END IF;
END;
/
--# 6.2 修改员工信息存储过程
CREATE OR REPLACE PROCEDURE sp_update_staff_info(
p_staff_id IN VARCHAR2,
p_name IN VARCHAR2 DEFAULT NULL,
p_position IN VARCHAR2 DEFAULT NULL,
p_contact IN VARCHAR2 DEFAULT NULL,
p_building_id IN VARCHAR2 DEFAULT NULL
)
IS
BEGIN
UPDATE staff
SET
name = COALESCE(p_name, name),
position = COALESCE(p_position, position),
contact = COALESCE(p_contact, contact),
building_id = COALESCE(p_building_id, building_id)
WHERE staff_id = p_staff_id;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20008, '员工不存在');
END IF;
END;
/
-- 7. 系统管理相关
--# 7.1 记录操作日志存储过程
CREATE OR REPLACE PROCEDURE sp_log_operation(
p_user_id IN VARCHAR2,
p_operation IN VARCHAR2
)
IS
BEGIN
INSERT INTO system_log (user_id, operation)
VALUES (p_user_id, p_operation);
END;
/
--# 7.2 获取用户最后登录时间函数
CREATE OR REPLACE FUNCTION fn_get_last_login(
p_user_id IN VARCHAR2
) RETURN DATE
IS
v_last_login DATE;
BEGIN
SELECT last_login INTO v_last_login
FROM system_users
WHERE user_id = p_user_id;
RETURN v_last_login;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
/
3.4. 触发器
|
3.5. 数据操纵
|