This commit is contained in:
2026-04-14 18:17:52 +08:00
172 changed files with 9123 additions and 1138 deletions

View File

@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/javajdk">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
<attributes>
<attribute name="module" value="true"/>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
@@ -18,9 +19,6 @@
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/slf4j-api-1.7.36-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/logback-classic-1.2.11-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/logback-core-1.2.11-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-core-3.1.0-rc1-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-databind-3.1.0-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-annotations-2.15.1-javadoc.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-core-2.15.2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-annotations-2.15.2.jar"/>
<classpathentry kind="lib" path="WebContent/WEB-INF/lib/jackson-databind-2.15.2.jar"/>

8
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
</annotationProcessing>
</component>
</project>

10
.idea/webContexts.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WebContextManager">
<option name="state">
<map>
<entry key="file://$PROJECT_DIR$/WebContent/view/Reader.jsp" value="file://$PROJECT_DIR$/WebContent/view" />
</map>
</option>
</component>
</project>

View File

@@ -1,7 +1,10 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11

View File

@@ -3,6 +3,7 @@
<wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="context-root" value="LM"/>
<property name="java-output-path" value="/LM/build/classes"/>
<!-- 必须是「项目根下的 build/classes」不能写成 /LM/build/classes否则类文件不会进 WEB-INF/classesTomcat 会 ClassNotFound -->
<property name="java-output-path" value="/build/classes"/>
</wb-module>
</project-modules>

View File

@@ -18,9 +18,201 @@ SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for library_management_activity
-- 删除旧表(如果存在)
-- ----------------------------
DROP TABLE IF EXISTS `library_management_activity_registration`;
DROP TABLE IF EXISTS `library_management_assistance_log`;
DROP TABLE IF EXISTS `library_management_borrow_record`;
DROP TABLE IF EXISTS `library_management_book_copy`;
DROP TABLE IF EXISTS `library_management_activity`;
DROP TABLE IF EXISTS `library_management_book`;
DROP TABLE IF EXISTS `library_management_employee`;
DROP TABLE IF EXISTS `library_management_reader`;
-- ----------------------------
-- Table structure for library_management_reader读者信息表
-- ----------------------------
CREATE TABLE `library_management_reader` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`card_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '读者证号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '读者姓名',
`age` int NULL DEFAULT NULL COMMENT '年龄',
`reader_type` tinyint NOT NULL DEFAULT 3 COMMENT '读者类型1-老年2-成人3-儿童',
`contact` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式',
`reg_date` date NULL DEFAULT NULL COMMENT '注册日期',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_card_number`(`card_number` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '读者信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_reader测试数据不同类型的读者
-- ----------------------------
INSERT INTO `library_management_reader` VALUES
(1, 'R2024001', '张小明', 8, 3, '13800000001', '2024-01-15', 'E001', '2024-01-15 10:00:00', NULL, NULL),
(2, 'R2024002', '李华', 65, 1, '13800000002', '2024-02-10', 'E001', '2024-02-10 09:30:00', NULL, NULL),
(3, 'R2024003', '王芳', 35, 2, '13800000003', '2024-03-05', 'E002', '2024-03-05 14:20:00', NULL, NULL),
(4, 'R2024004', '陈思思', 12, 3, '13800000004', '2024-04-01', 'E002', '2024-04-01 11:00:00', NULL, NULL),
(5, 'R2024005', '刘建国', 72, 1, '13800000005', '2024-04-20', 'E002', '2024-04-20 16:45:00', NULL, NULL),
(6, 'R2024006', '赵敏', 28, 2, '13800000006', '2024-05-10', 'E001', '2024-05-10 08:00:00', NULL, NULL),
(7, 'R2024007', '孙小燕', 6, 3, '13800000007', '2024-06-01', 'E003', '2024-06-01 10:30:00', NULL, NULL),
(8, 'R2024008', '周大伟', 45, 2, '13800000008', '2024-06-15', 'E003', '2024-06-15 13:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_employee员工信息表
-- ----------------------------
CREATE TABLE `library_management_employee` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`employee_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工工号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工姓名',
`position` tinyint NOT NULL DEFAULT 1 COMMENT '职位1-馆员2-工作人员3-经理',
`contact` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式',
`hire_date` date NULL DEFAULT NULL COMMENT '入职日期',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_employee_code`(`employee_code` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '员工信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_employee测试数据三种角色的员工
-- ----------------------------
INSERT INTO `library_management_employee` VALUES
(1, 'E001', '张经理', 3, '13900000001', '2020-01-01', NULL, '2020-01-01 08:00:00', NULL, NULL),
(2, 'E002', '李工作人员', 2, '13900000002', '2021-03-15', 'E001', '2021-03-15 09:00:00', NULL, NULL),
(3, 'E003', '王馆员', 1, '13900000003', '2022-06-01', 'E001', '2022-06-01 10:00:00', NULL, NULL),
(4, 'E004', '刘工作人员', 2, '13900000004', '2023-01-10', 'E001', '2023-01-10 08:30:00', NULL, NULL),
(5, 'E005', '陈馆员', 1, '13900000005', '2023-09-01', 'E001', '2023-09-01 09:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_book图书基本信息表
-- ----------------------------
CREATE TABLE `library_management_book` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`isbn` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '国际标准书号',
`title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '书名',
`author` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作者',
`publisher` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '出版社',
`publish_year` int NULL DEFAULT NULL COMMENT '出版年份',
`total_stock` int NOT NULL DEFAULT 0 COMMENT '总副本数',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '图书简介',
`target_audience` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '通用' COMMENT '面向群体:通用/儿童/成人/老年',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_isbn`(`isbn` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书基本信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_book测试数据多种类型图书
-- ----------------------------
INSERT INTO `library_management_book` VALUES
(1, '978-7-111-00001-1', 'Java核心技术卷I', 'Cay S. Horstmann', '机械工业出版社', 2020, 3, 'Java语言经典教材涵盖Java基础语法和核心库', '通用', 'E003', '2024-01-10 10:00:00', NULL, NULL),
(2, '978-7-111-00002-8', 'Python编程从入门到实践', 'Eric Matthes', '人民邮电出版社', 2019, 5, 'Python入门经典书籍配有大量实践项目', '通用', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(3, '978-7-111-00003-5', '小王子', '安托万·德·圣-埃克苏佩里', '商务印书馆', 2018, 4, '儿童文学经典,讲述小王子的星际旅行', '儿童', 'E003', '2024-01-15 09:00:00', NULL, NULL),
(4, '978-7-111-00004-2', '格林童话全集', '格林兄弟', '译林出版社', 2021, 3, '经典童话故事集,适合儿童阅读', '儿童', 'E003', '2024-01-18 14:00:00', NULL, NULL),
(5, '978-7-111-00005-9', '活着', '余华', '作家出版社', 2012, 2, '余华代表作,讲述普通人的命运', '成人', 'E003', '2024-02-01 10:00:00', NULL, NULL),
(6, '978-7-111-00006-6', '老年健康养生指南', '张明', '卫生出版社', 2023, 2, '老年人健康养生实用手册', '老年', 'E002', '2024-02-05 15:00:00', NULL, NULL),
(7, '978-7-111-00007-3', '数据结构与算法分析', 'Mark Allen Weiss', '电子工业出版社', 2020, 3, '经典算法教材,深入分析各种数据结构', '通用', 'E003', '2024-02-10 09:00:00', NULL, NULL),
(8, '978-7-111-00008-0', '安徒生童话选', '汉斯·克里斯蒂安·安徒生', '少年儿童出版社', 2022, 3, '安徒生经典童话故事,适合亲子阅读', '儿童', 'E002', '2024-02-15 11:00:00', NULL, NULL),
(9, '978-7-111-00009-7', '红楼梦', '曹雪芹', '人民文学出版社', 2019, 2, '中国古典四大名著之一', '成人', 'E003', '2024-03-01 10:00:00', NULL, NULL),
(10, '978-7-111-00010-3', '书法与养生', '李明', '文化艺术出版社', 2023, 2, '书法练习对老年人健康的好处', '老年', 'E002', '2024-03-10 14:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_book_copy图书副本表
-- ----------------------------
CREATE TABLE `library_management_book_copy` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`book_id` bigint NOT NULL COMMENT '所属图书ID',
`barcode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '条形码',
`location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '存放位置',
`status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '可借' COMMENT '状态:可借/借出/损坏',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_barcode`(`barcode` ASC) USING BTREE,
INDEX `idx_book_id`(`book_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书副本表(每本实体书)' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_book_copy每本书的副本数据
-- ----------------------------
INSERT INTO `library_management_book_copy` VALUES
(1, 1, '978-7-111-00001-1-001', 'A区-1-01', '可借', 'E003', '2024-01-10 10:00:00', NULL, NULL),
(2, 1, '978-7-111-00001-1-002', 'A区-1-02', '可借', 'E003', '2024-01-10 10:00:00', NULL, NULL),
(3, 1, '978-7-111-00001-1-003', 'A区-1-03', '可借', 'E003', '2024-01-10 10:00:00', NULL, NULL),
(4, 2, '978-7-111-00002-8-001', 'A区-2-01', '可借', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(5, 2, '978-7-111-00002-8-002', 'A区-2-02', '可借', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(6, 2, '978-7-111-00002-8-003', 'A区-2-03', '可借', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(7, 2, '978-7-111-00002-8-004', 'A区-2-04', '可借', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(8, 2, '978-7-111-00002-8-005', 'A区-2-05', '可借', 'E003', '2024-01-12 11:00:00', NULL, NULL),
(9, 3, '978-7-111-00003-5-001', 'B区-1-01', '可借', 'E003', '2024-01-15 09:00:00', NULL, NULL),
(10, 3, '978-7-111-00003-5-002', 'B区-1-02', '可借', 'E003', '2024-01-15 09:00:00', NULL, NULL),
(11, 3, '978-7-111-00003-5-003', 'B区-1-03', '可借', 'E003', '2024-01-15 09:00:00', NULL, NULL),
(12, 3, '978-7-111-00003-5-004', 'B区-1-04', '可借', 'E003', '2024-01-15 09:00:00', NULL, NULL),
(13, 4, '978-7-111-00004-2-001', 'B区-2-01', '可借', 'E003', '2024-01-18 14:00:00', NULL, NULL),
(14, 4, '978-7-111-00004-2-002', 'B区-2-02', '可借', 'E003', '2024-01-18 14:00:00', NULL, NULL),
(15, 4, '978-7-111-00004-2-003', 'B区-2-03', '可借', 'E003', '2024-01-18 14:00:00', NULL, NULL),
(16, 5, '978-7-111-00005-9-001', 'C区-1-01', '可借', 'E003', '2024-02-01 10:00:00', NULL, NULL),
(17, 5, '978-7-111-00005-9-002', 'C区-1-02', '可借', 'E003', '2024-02-01 10:00:00', NULL, NULL),
(18, 6, '978-7-111-00006-6-001', 'D区-1-01', '可借', 'E002', '2024-02-05 15:00:00', NULL, NULL),
(19, 6, '978-7-111-00006-6-002', 'D区-1-02', '可借', 'E002', '2024-02-05 15:00:00', NULL, NULL),
(20, 7, '978-7-111-00007-3-001', 'A区-3-01', '可借', 'E003', '2024-02-10 09:00:00', NULL, NULL),
(21, 7, '978-7-111-00007-3-002', 'A区-3-02', '可借', 'E003', '2024-02-10 09:00:00', NULL, NULL),
(22, 7, '978-7-111-00007-3-003', 'A区-3-03', '可借', 'E003', '2024-02-10 09:00:00', NULL, NULL),
(23, 8, '978-7-111-00008-0-001', 'B区-3-01', '可借', 'E002', '2024-02-15 11:00:00', NULL, NULL),
(24, 8, '978-7-111-00008-0-002', 'B区-3-02', '可借', 'E002', '2024-02-15 11:00:00', NULL, NULL),
(25, 8, '978-7-111-00008-0-003', 'B区-3-03', '可借', 'E002', '2024-02-15 11:00:00', NULL, NULL),
(26, 9, '978-7-111-00009-7-001', 'C区-2-01', '可借', 'E003', '2024-03-01 10:00:00', NULL, NULL),
(27, 9, '978-7-111-00009-7-002', 'C区-2-02', '可借', 'E003', '2024-03-01 10:00:00', NULL, NULL),
(28, 10, '978-7-111-00010-3-001', 'D区-2-01', '可借', 'E002', '2024-03-10 14:00:00', NULL, NULL),
(29, 10, '978-7-111-00010-3-002', 'D区-2-02', '可借', 'E002', '2024-03-10 14:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_borrow_record借阅记录表
-- ----------------------------
CREATE TABLE `library_management_borrow_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`reader_id` bigint NOT NULL COMMENT '读者ID',
`copy_id` bigint NOT NULL COMMENT '副本ID',
`borrow_date` date NOT NULL COMMENT '借出日期',
`due_date` date NOT NULL COMMENT '应还日期',
`return_date` date NULL DEFAULT NULL COMMENT '实际归还日期',
`renew_count` int NOT NULL DEFAULT 0 COMMENT '续借次数',
`operator_id` bigint NULL DEFAULT NULL COMMENT '办理员工ID读者自助借书时为空',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_reader_id`(`reader_id` ASC) USING BTREE,
INDEX `idx_copy_id`(`copy_id` ASC) USING BTREE,
INDEX `idx_operator_id`(`operator_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '借阅记录表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_borrow_record测试数据部分借阅记录
-- ----------------------------
INSERT INTO `library_management_borrow_record` VALUES
(1, 3, 1, '2024-02-10', '2024-03-11', '2024-03-05', 0, 2, 'E002', '2024-02-10 10:00:00', NULL, NULL),
(2, 6, 5, '2024-02-20', '2024-03-21', '2024-03-18', 0, 2, 'E002', '2024-02-20 14:00:00', NULL, NULL),
(3, 8, 20, '2024-03-01', '2024-03-31', NULL, 0, 3, 'E003', '2024-03-01 09:00:00', NULL, NULL),
(4, 3, 9, '2024-03-05', '2024-04-04', NULL, 0, 2, 'E002', '2024-03-05 11:00:00', NULL, NULL),
(5, 6, 16, '2024-03-10', '2024-04-09', NULL, 0, 3, 'E003', '2024-03-10 10:00:00', NULL, NULL),
(6, 8, 4, '2024-03-15', '2024-04-14', NULL, 0, 2, 'E002', '2024-03-15 15:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_activity活动信息表
-- ----------------------------
CREATE TABLE `library_management_activity` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动名称',
@@ -28,8 +220,8 @@ CREATE TABLE `library_management_activity` (
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`location` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动地点',
`target_reader_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '面向群体,如老年,儿童',
`manager_id` bigint NOT NULL COMMENT '负责人ID',
`target_reader_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '面向群体,如"老年,儿童"',
`manager_id` bigint NULL DEFAULT NULL COMMENT '负责人ID(读者端创建活动时为空)',
`max_participants` int NOT NULL DEFAULT 0 COMMENT '最大参与人数',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
@@ -40,13 +232,18 @@ CREATE TABLE `library_management_activity` (
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '活动信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_activity
-- Records of library_management_activity(测试数据:面向不同群体的活动)
-- ----------------------------
INSERT INTO `library_management_activity` VALUES
(1, '儿童绘本故事会', '邀请专业讲师为小朋友讲述经典绘本故事,培养阅读兴趣', '2026-04-05 10:00:00', '2026-04-05 11:30:00', '二楼儿童阅览室', '儿童', 1, 30, 'E001', '2026-03-20 09:00:00', NULL, NULL),
(2, '老年健康讲座', '邀请医学专家讲解老年健康养生知识', '2026-04-12 14:00:00', '2026-04-12 16:00:00', '三楼报告厅', '老年', 1, 50, 'E001', '2026-03-21 10:00:00', NULL, NULL),
(3, '成人读书分享会', '本月主题:《活着》读书分享与讨论', '2026-04-20 19:00:00', '2026-04-20 21:00:00', '一楼多功能厅', '成人', 1, 40, 'E001', '2026-03-22 08:00:00', NULL, NULL),
(4, '青少年编程体验课', 'Python入门体验让青少年感受编程乐趣', '2026-04-08 14:00:00', '2026-04-08 16:00:00', '电子阅览室', '儿童,成人', 1, 20, 'E001', '2026-03-23 09:00:00', NULL, NULL),
(5, '书法交流活动', '老年人书法爱好者交流活动', '2026-04-15 09:00:00', '2026-04-15 12:00:00', '五楼书法室', '老年', 1, 25, 'E001', '2026-03-23 14:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_activity_registration
-- Table structure for library_management_activity_registration(活动报名表)
-- ----------------------------
DROP TABLE IF EXISTS `library_management_activity_registration`;
CREATE TABLE `library_management_activity_registration` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`activity_id` bigint NOT NULL COMMENT '活动ID',
@@ -64,11 +261,22 @@ CREATE TABLE `library_management_activity_registration` (
-- ----------------------------
-- Records of library_management_activity_registration
-- ----------------------------
INSERT INTO `library_management_activity_registration` VALUES
(1, 1, 1, '2026-03-20 10:00:00', 0, NULL, '2026-03-20 10:00:00', NULL, NULL),
(2, 1, 4, '2026-03-20 11:00:00', 0, NULL, '2026-03-20 11:00:00', NULL, NULL),
(3, 1, 7, '2026-03-21 09:00:00', 0, NULL, '2026-03-21 09:00:00', NULL, NULL),
(4, 2, 2, '2026-03-21 10:00:00', 0, NULL, '2026-03-21 10:00:00', NULL, NULL),
(5, 2, 5, '2026-03-21 14:00:00', 0, NULL, '2026-03-21 14:00:00', NULL, NULL),
(6, 3, 3, '2026-03-22 08:00:00', 0, NULL, '2026-03-22 08:00:00', NULL, NULL),
(7, 3, 6, '2026-03-22 09:00:00', 0, NULL, '2026-03-22 09:00:00', NULL, NULL),
(8, 3, 8, '2026-03-22 15:00:00', 0, NULL, '2026-03-22 15:00:00', NULL, NULL),
(9, 4, 1, '2026-03-23 09:00:00', 0, NULL, '2026-03-23 09:00:00', NULL, NULL),
(10, 5, 2, '2026-03-23 14:00:00', 0, NULL, '2026-03-23 14:00:00', NULL, NULL),
(11, 5, 5, '2026-03-23 16:00:00', 0, NULL, '2026-03-23 16:00:00', NULL, NULL);
-- ----------------------------
-- Table structure for library_management_assistance_log
-- Table structure for library_management_assistance_log(读者咨询记录表)
-- ----------------------------
DROP TABLE IF EXISTS `library_management_assistance_log`;
CREATE TABLE `library_management_assistance_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`reader_id` bigint NOT NULL COMMENT '读者ID',
@@ -88,127 +296,10 @@ CREATE TABLE `library_management_assistance_log` (
-- ----------------------------
-- Records of library_management_assistance_log
-- ----------------------------
-- ----------------------------
-- Table structure for library_management_book
-- ----------------------------
DROP TABLE IF EXISTS `library_management_book`;
CREATE TABLE `library_management_book` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`isbn` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '国际标准书号',
`title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '书名',
`author` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作者',
`publisher` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '出版社',
`publish_year` int NULL DEFAULT NULL COMMENT '出版年份',
`total_stock` int NOT NULL DEFAULT 0 COMMENT '总副本数',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '图书简介',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_isbn`(`isbn` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书基本信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_book
-- ----------------------------
-- ----------------------------
-- Table structure for library_management_book_copy
-- ----------------------------
DROP TABLE IF EXISTS `library_management_book_copy`;
CREATE TABLE `library_management_book_copy` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`book_id` bigint NOT NULL COMMENT '所属图书ID',
`barcode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '条形码',
`location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '存放位置',
`status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '可借' COMMENT '状态:可借/借出/损坏',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_barcode`(`barcode` ASC) USING BTREE,
INDEX `idx_book_id`(`book_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书副本表(每本实体书)' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_book_copy
-- ----------------------------
-- ----------------------------
-- Table structure for library_management_borrow_record
-- ----------------------------
DROP TABLE IF EXISTS `library_management_borrow_record`;
CREATE TABLE `library_management_borrow_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`reader_id` bigint NOT NULL COMMENT '读者ID',
`copy_id` bigint NOT NULL COMMENT '副本ID',
`borrow_date` date NOT NULL COMMENT '借出日期',
`due_date` date NOT NULL COMMENT '应还日期',
`return_date` date NULL DEFAULT NULL COMMENT '实际归还日期',
`renew_count` int NOT NULL DEFAULT 0 COMMENT '续借次数',
`operator_id` bigint NOT NULL COMMENT '办理员工ID',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_reader_id`(`reader_id` ASC) USING BTREE,
INDEX `idx_copy_id`(`copy_id` ASC) USING BTREE,
INDEX `idx_operator_id`(`operator_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '借阅记录表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_borrow_record
-- ----------------------------
-- ----------------------------
-- Table structure for library_management_employee
-- ----------------------------
DROP TABLE IF EXISTS `library_management_employee`;
CREATE TABLE `library_management_employee` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`employee_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工工号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工姓名',
`position` tinyint NOT NULL DEFAULT 1 COMMENT '职位1-馆员2-工作人员3-经理',
`contact` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式',
`hire_date` date NULL DEFAULT NULL COMMENT '入职日期',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_employee_code`(`employee_code` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '员工信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_employee
-- ----------------------------
-- ----------------------------
-- Table structure for library_management_reader
-- ----------------------------
DROP TABLE IF EXISTS `library_management_reader`;
CREATE TABLE `library_management_reader` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`card_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '读者证号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '读者姓名',
`age` int NULL DEFAULT NULL COMMENT '年龄',
`reader_type` tinyint NOT NULL DEFAULT 3 COMMENT '读者类型1-老年2-成人3-儿童',
`contact` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式',
`reg_date` date NULL DEFAULT NULL COMMENT '注册日期',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_card_number`(`card_number` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '读者信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of library_management_reader
-- ----------------------------
INSERT INTO `library_management_assistance_log` VALUES
(1, 1, 2, '2024-02-10 10:00:00', '帮助小读者张小明注册办证', '家长陪同', NULL, '2024-02-10 10:00:00', NULL, NULL),
(2, 2, 2, '2024-02-15 14:00:00', '老年读者李华咨询借阅规则', '已解答', NULL, '2024-02-15 14:00:00', NULL, NULL),
(3, 4, 4, '2024-04-05 11:00:00', '帮助陈思思注册办证(儿童)', '家长陪同', NULL, '2024-04-05 11:00:00', NULL, NULL),
(4, 7, 4, '2024-06-10 10:30:00', '帮助孙小燕注册办证(儿童)', '家长陪同', NULL, '2024-06-10 10:30:00', NULL, NULL);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -3,4 +3,12 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>view/Login.jsp</welcome-file>
</welcome-file-list>
<!-- 过滤器统一使用 @WebFilter 注解注册,不需要在 web.xml 中重复配置 -->
<!-- 执行顺序由 @WebFilter 的 filter-name 字母顺序决定A → E → EmployeePermission -->
</web-app>

View File

@@ -8,28 +8,166 @@
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<style>
/* 样式保持不变,省略(实际使用时应保留原有样式) */
* { margin:0; padding:0; box-sizing:border-box; }
body { background:#eef2f6; font-family:'Inter',sans-serif; display:flex; align-items:center; justify-content:center; min-height:100vh; padding:1rem; }
#app { width:100%; max-width:520px; }
.card { background:white; border-radius:28px; box-shadow:0 25px 45px -12px rgba(0,0,0,0.15); padding:2.2rem 2rem; width:100%; }
h2 { font-size:1.9rem; font-weight:600; color:#1a2b3c; margin-bottom:1.5rem; border-bottom:2px solid #f0f4f9; padding-bottom:1rem; }
h3 { font-size:1.2rem; font-weight:500; color:#2c3e50; margin-bottom:1.2rem; }
.field { margin-bottom:1.3rem; }
label { display:block; font-size:0.8rem; font-weight:600; text-transform:uppercase; color:#4a5e74; margin-bottom:0.3rem; }
input, select { width:100%; padding:0.8rem 1rem; font-size:1rem; border:1.5px solid #e2e9f2; border-radius:16px; background:#fff; transition:border 0.15s; outline:none; }
input:focus, select:focus { border-color:#7c8ea0; background:#fafcff; }
button { background:#2c3e50; color:white; border:none; padding:0.9rem 1.5rem; font-size:1rem; font-weight:500; border-radius:40px; cursor:pointer; transition:background 0.15s; width:100%; margin-top:0.3rem; }
button:hover { background:#1d2c3a; }
.secondary-btn { background:white; color:#2c3e50; border:1.5px solid #d0ddee; margin-top:1rem; }
.secondary-btn:hover { background:#f2f6fc; border-color:#a0b8cf; }
.nav-links { display:flex; justify-content:space-between; margin-top:1.5rem; gap:0.5rem; flex-wrap:wrap; }
.nav-link { background:#f0f5fb; color:#2e405b; padding:0.6rem 1.2rem; border-radius:40px; font-size:0.9rem; font-weight:500; cursor:pointer; border:1px solid transparent; transition:background 0.15s; text-align:center; flex:1 1 auto; }
.nav-link:hover { background:#dae2ed; color:#0e1e2f; }
.active-view { margin-bottom:1rem; }
.note { font-size:0.75rem; color:#8f9fb1; margin-top:0.5rem; text-align:center; }
.compact-form { background:#f9fcff; border-radius:20px; padding:1.5rem 1.2rem; margin:0.5rem 0 1rem; }
.nav-link.active-nav { background:#2c3e50; color:white; border-color:#2c3e50; }
.nav-link.active-nav:hover { background:#1d2c3a; }
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #eef2f6;
font-family: 'Inter', sans-serif;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 1rem;
}
#app {
width: 100%;
max-width: 520px;
}
.card {
background: white;
border-radius: 28px;
box-shadow: 0 25px 45px -12px rgba(0, 0, 0, 0.15);
padding: 2.2rem 2rem;
width: 100%;
}
h2 {
font-size: 1.9rem;
font-weight: 600;
color: #1a2b3c;
margin-bottom: 1.5rem;
border-bottom: 2px solid #f0f4f9;
padding-bottom: 1rem;
}
h3 {
font-size: 1.2rem;
font-weight: 500;
color: #2c3e50;
margin-bottom: 1.2rem;
}
.field {
margin-bottom: 1.3rem;
}
label {
display: block;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
color: #4a5e74;
margin-bottom: 0.3rem;
}
input,
select {
width: 100%;
padding: 0.8rem 1rem;
font-size: 1rem;
border: 1.5px solid #e2e9f2;
border-radius: 16px;
background: #fff;
transition: border 0.15s;
outline: none;
}
input:focus,
select:focus {
border-color: #7c8ea0;
background: #fafcff;
}
button {
background: #2c3e50;
color: white;
border: none;
padding: 0.9rem 1.5rem;
font-size: 1rem;
font-weight: 500;
border-radius: 40px;
cursor: pointer;
transition: background 0.15s;
width: 100%;
margin-top: 0.3rem;
}
button:hover {
background: #1d2c3a;
}
.secondary-btn {
background: white;
color: #2c3e50;
border: 1.5px solid #d0ddee;
margin-top: 1rem;
}
.secondary-btn:hover {
background: #f2f6fc;
border-color: #a0b8cf;
}
.nav-links {
display: flex;
justify-content: space-between;
margin-top: 1.5rem;
gap: 0.5rem;
flex-wrap: wrap;
}
.nav-link {
background: #f0f5fb;
color: #2e405b;
padding: 0.6rem 1.2rem;
border-radius: 40px;
font-size: 0.9rem;
font-weight: 500;
cursor: pointer;
border: 1px solid transparent;
transition: background 0.15s;
text-align: center;
flex: 1 1 auto;
}
.nav-link:hover {
background: #dae2ed;
color: #0e1e2f;
}
.active-view {
margin-bottom: 1rem;
}
.note {
font-size: 0.75rem;
color: #8f9fb1;
margin-top: 0.5rem;
text-align: center;
}
.compact-form {
background: #f9fcff;
border-radius: 20px;
padding: 1.5rem 1.2rem;
margin: 0.5rem 0 1rem;
}
.nav-link.active-nav {
background: #2c3e50;
color: white;
border-color: #2c3e50;
}
.nav-link.active-nav:hover {
background: #1d2c3a;
}
</style>
</head>
<body>

View File

@@ -3,8 +3,9 @@
<%@ page import="com.chinasofti.enums.ReaderType" %>
<%
Reader currentReader = (Reader) session.getAttribute("currentReader");
// Login.jsp 在 /view/Login.jsp需要返回上级目录
if (currentReader == null) {
response.sendRedirect(request.getContextPath() + "/Login.jsp");
response.sendRedirect(request.getContextPath() + "/../Login.jsp");
return;
}
// 准备传递给前端的数据
@@ -29,51 +30,347 @@
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<style>
/* 样式与原来相同,此处省略(请保留原样式) */
* { margin:0; padding:0; box-sizing:border-box; }
body { background:#eef2f6; font-family:'Inter',sans-serif; display:flex; align-items:center; justify-content:center; min-height:100vh; padding:1rem; }
#app { width:100%; max-width:1400px; }
.app-container { background:white; border-radius:32px; box-shadow:0 30px 50px -20px rgba(0,0,0,0.2); overflow:hidden; }
.header { display:flex; align-items:center; justify-content:space-between; padding:1.2rem 2rem; background:#fff; border-bottom:1px solid #eaf0f6; }
.user-info { display:flex; align-items:center; gap:1.5rem; flex-wrap:wrap; }
.user-greeting { font-weight:600; font-size:1.2rem; color:#1a2b3c; background:#f0f6fe; padding:0.4rem 1.2rem; border-radius:40px; }
.logout-btn { background:white; border:1.5px solid #dae2ed; color:#3b4e62; padding:0.4rem 1.4rem; border-radius:40px; font-weight:500; font-size:0.9rem; cursor:pointer; transition:all 0.15s; }
.logout-btn:hover { background:#f1f7fd; border-color:#9bb1c9; }
.child-note { background:#fdf6e6; color:#926d39; border-radius:40px; padding:0.3rem 1.2rem; font-size:0.8rem; font-weight:500; display:inline-block; }
.nav-tabs { display:flex; gap:0.8rem; }
.nav-tab { background:transparent; border:none; padding:0.6rem 1.8rem; font-size:1rem; font-weight:600; color:#5d7184; border-radius:40px; cursor:pointer; transition:0.15s; border:1.5px solid transparent; }
.nav-tab.active { background:#2c3e50; color:white; }
.nav-tab:not(.active):hover { background:#eef3f9; color:#2c3e50; }
.main-content { padding:2rem; }
.borrow-layout { display:flex; flex-direction:column; gap:2.5rem; }
.section-card { background:#f9fcff; border-radius:24px; padding:1.6rem 1.8rem; border:1px solid #e6edf5; }
.section-title { font-size:1.2rem; font-weight:600; color:#1e3b5c; margin-bottom:1.5rem; display:flex; align-items:center; gap:0.5rem; flex-wrap:wrap; }
.search-row { display:flex; flex-wrap:wrap; gap:1rem; align-items:flex-end; margin-bottom:2rem; }
.search-field { flex:1 1 160px; }
.search-field label { display:block; font-size:0.75rem; font-weight:600; text-transform:uppercase; color:#5f748b; margin-bottom:0.3rem; }
.search-field input { width:100%; padding:0.6rem 1rem; border:1.5px solid #d8e2ee; border-radius:30px; font-size:0.95rem; background:white; }
.search-field input:focus { outline:none; border-color:#7e99b3; }
.search-btn { background:#2c3e50; color:white; border:none; padding:0.6rem 2rem; border-radius:30px; font-weight:500; cursor:pointer; font-size:0.95rem; transition:background 0.15s; height:fit-content; align-self:center; }
.search-btn:hover { background:#1a2b3c; }
.table-wrapper { overflow-x:auto; border-radius:18px; background:white; box-shadow:0 4px 12px rgba(0,0,0,0.02); margin-top:1rem; }
table { width:100%; border-collapse:collapse; font-size:0.9rem; min-width:1000px; }
th { background:#eef4fa; color:#1d3b5c; font-weight:600; padding:1rem 0.8rem; text-align:left; white-space:nowrap; }
td { padding:1rem 0.8rem; border-bottom:1px solid #eef3f8; color:#1f2f40; }
.action-btn { background:#2c3e50; color:white; border:none; padding:0.4rem 1.2rem; border-radius:30px; font-size:0.8rem; font-weight:500; cursor:pointer; transition:background 0.15s; }
.action-btn.return { background:#9b6b43; }
.action-btn.return:hover { background:#7e4f2e; }
.action-btn:hover { background:#1a2b3c; }
.child-badge { background:#c9dff3; color:#144a70; padding:0.2rem 0.8rem; border-radius:30px; font-size:0.75rem; font-weight:600; display:inline-block; }
.empty-row td { padding:2rem; text-align:center; color:#8c9db2; font-style:italic; }
.activity-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(260px,1fr)); gap:1.8rem; margin-top:1.5rem; }
.activity-card { background:white; border-radius:24px; padding:1.5rem; box-shadow:0 8px 18px rgba(0,0,0,0.03); border:1px solid #e6edf5; transition:transform 0.1s; display:flex; flex-direction:column; }
.activity-card:hover { transform:translateY(-2px); box-shadow:0 12px 24px rgba(0,0,0,0.05); }
.activity-name { font-size:1.2rem; font-weight:600; color:#1e3b5c; margin-bottom:0.5rem; }
.activity-time { color:#6e8aa8; font-size:0.9rem; margin-bottom:0.5rem; display:flex; align-items:center; gap:0.3rem; }
.activity-desc { color:#3a4e66; font-size:0.95rem; line-height:1.4; margin:0.8rem 0 1.2rem; flex:1; }
.signup-btn { background:#2c3e50; color:white; border:none; padding:0.6rem 1rem; border-radius:40px; font-weight:500; font-size:0.9rem; cursor:pointer; transition:background 0.15s; align-self:flex-start; width:100%; }
.signup-btn:hover { background:#1a2b3c; }
.info-note { background:#eaf2fb; padding:0.5rem 1.2rem; border-radius:40px; color:#2c577c; font-size:0.85rem; display:inline-block; }
.empty-placeholder { text-align:center; padding:2rem; background:white; border-radius:18px; color:#8f9fb1; }
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #eef2f6;
font-family: 'Inter', sans-serif;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 1rem;
}
#app {
width: 100%;
max-width: 1400px;
}
.app-container {
background: white;
border-radius: 32px;
box-shadow: 0 30px 50px -20px rgba(0, 0, 0, 0.2);
overflow: hidden;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.2rem 2rem;
background: #fff;
border-bottom: 1px solid #eaf0f6;
}
.user-info {
display: flex;
align-items: center;
gap: 1.5rem;
flex-wrap: wrap;
}
.user-greeting {
font-weight: 600;
font-size: 1.2rem;
color: #1a2b3c;
background: #f0f6fe;
padding: 0.4rem 1.2rem;
border-radius: 40px;
}
.logout-btn {
background: white;
border: 1.5px solid #dae2ed;
color: #3b4e62;
padding: 0.4rem 1.4rem;
border-radius: 40px;
font-weight: 500;
font-size: 0.9rem;
cursor: pointer;
transition: all 0.15s;
}
.logout-btn:hover {
background: #f1f7fd;
border-color: #9bb1c9;
}
.child-note {
background: #fdf6e6;
color: #926d39;
border-radius: 40px;
padding: 0.3rem 1.2rem;
font-size: 0.8rem;
font-weight: 500;
display: inline-block;
}
.nav-tabs {
display: flex;
gap: 0.8rem;
}
.nav-tab {
background: transparent;
border: none;
padding: 0.6rem 1.8rem;
font-size: 1rem;
font-weight: 600;
color: #5d7184;
border-radius: 40px;
cursor: pointer;
transition: 0.15s;
border: 1.5px solid transparent;
}
.nav-tab.active {
background: #2c3e50;
color: white;
}
.nav-tab:not(.active):hover {
background: #eef3f9;
color: #2c3e50;
}
.main-content {
padding: 2rem;
}
.borrow-layout {
display: flex;
flex-direction: column;
gap: 2.5rem;
}
.section-card {
background: #f9fcff;
border-radius: 24px;
padding: 1.6rem 1.8rem;
border: 1px solid #e6edf5;
}
.section-title {
font-size: 1.2rem;
font-weight: 600;
color: #1e3b5c;
margin-bottom: 1.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
}
.search-row {
display: flex;
flex-wrap: wrap;
gap: 1rem;
align-items: flex-end;
margin-bottom: 2rem;
}
.search-field {
flex: 1 1 160px;
}
.search-field label {
display: block;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
color: #5f748b;
margin-bottom: 0.3rem;
}
.search-field input {
width: 100%;
padding: 0.6rem 1rem;
border: 1.5px solid #d8e2ee;
border-radius: 30px;
font-size: 0.95rem;
background: white;
}
.search-field input:focus {
outline: none;
border-color: #7e99b3;
}
.search-btn {
background: #2c3e50;
color: white;
border: none;
padding: 0.6rem 2rem;
border-radius: 30px;
font-weight: 500;
cursor: pointer;
font-size: 0.95rem;
transition: background 0.15s;
height: fit-content;
align-self: center;
}
.search-btn:hover {
background: #1a2b3c;
}
.table-wrapper {
overflow-x: auto;
border-radius: 18px;
background: white;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.02);
margin-top: 1rem;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
min-width: 1000px;
}
th {
background: #eef4fa;
color: #1d3b5c;
font-weight: 600;
padding: 1rem 0.8rem;
text-align: left;
white-space: nowrap;
}
td {
padding: 1rem 0.8rem;
border-bottom: 1px solid #eef3f8;
color: #1f2f40;
}
.action-btn {
background: #2c3e50;
color: white;
border: none;
padding: 0.4rem 1.2rem;
border-radius: 30px;
font-size: 0.8rem;
font-weight: 500;
cursor: pointer;
transition: background 0.15s;
}
.action-btn.return {
background: #9b6b43;
}
.action-btn.return:hover {
background: #7e4f2e;
}
.action-btn:hover {
background: #1a2b3c;
}
.child-badge {
background: #c9dff3;
color: #144a70;
padding: 0.2rem 0.8rem;
border-radius: 30px;
font-size: 0.75rem;
font-weight: 600;
display: inline-block;
}
.empty-row td {
padding: 2rem;
text-align: center;
color: #8c9db2;
font-style: italic;
}
.activity-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 1.8rem;
margin-top: 1.5rem;
}
.activity-card {
background: white;
border-radius: 24px;
padding: 1.5rem;
box-shadow: 0 8px 18px rgba(0, 0, 0, 0.03);
border: 1px solid #e6edf5;
transition: transform 0.1s;
display: flex;
flex-direction: column;
}
.activity-card:hover {
transform: translateY(-2px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.05);
}
.activity-name {
font-size: 1.2rem;
font-weight: 600;
color: #1e3b5c;
margin-bottom: 0.5rem;
}
.activity-time {
color: #6e8aa8;
font-size: 0.9rem;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.3rem;
}
.activity-desc {
color: #3a4e66;
font-size: 0.95rem;
line-height: 1.4;
margin: 0.8rem 0 1.2rem;
flex: 1;
}
.signup-btn {
background: #2c3e50;
color: white;
border: none;
padding: 0.6rem 1rem;
border-radius: 40px;
font-weight: 500;
font-size: 0.9rem;
cursor: pointer;
transition: background 0.15s;
align-self: flex-start;
width: 100%;
}
.signup-btn:hover {
background: #1a2b3c;
}
.info-note {
background: #eaf2fb;
padding: 0.5rem 1.2rem;
border-radius: 40px;
color: #2c577c;
font-size: 0.85rem;
display: inline-block;
}
.empty-placeholder {
text-align: center;
padding: 2rem;
background: white;
border-radius: 18px;
color: #8f9fb1;
}
</style>
</head>
<body>
@@ -158,7 +455,7 @@
<div class="search-row" style="margin-bottom:1.5rem;">
<div class="search-field" style="flex:2;">
<label>读者证号</label>
<input v-model="borrowerAccount" type="text" placeholder="例如 R2024001" />
<input v-model="borrowerAccount" type="text" placeholder="例如 R2024001" readonly/>
</div>
<button class="search-btn" @click="searchBorrowed">查询借阅</button>
</div>
@@ -235,7 +532,8 @@
});
try {
const response = await fetch('${pageContext.request.contextPath}/api/books/search?' + params, {
method: 'GET'
method: 'GET',
credentials: 'include',
});
if (!response.ok) throw new Error('查询失败');
books.value = await response.json();
@@ -254,7 +552,8 @@
const response = await fetch('${pageContext.request.contextPath}/api/borrow', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params
body: params,
credentials: 'include' // 添加此行
});
const result = await response.json();
if (result.success) {
@@ -279,7 +578,8 @@
}
try {
const response = await fetch('${pageContext.request.contextPath}/api/borrows?readerCard=' + encodeURIComponent(borrowerAccount.value), {
method: 'GET'
method: 'GET',
credentials: 'include',
});
if (!response.ok) throw new Error('查询失败');
borrowedList.value = await response.json();
@@ -289,6 +589,7 @@
};
const returnBook = async (item) => {
console.log('>>> [归还] 点击归还按钮borrowId=' + item.borrowId);
const params = new URLSearchParams({
borrowId: item.borrowId
});
@@ -296,17 +597,21 @@
const response = await fetch('${pageContext.request.contextPath}/api/borrow', {
method: 'PUT',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params
body: params,
credentials: 'include',
});
console.log('>>> [归还] HTTP状态码=' + response.status);
const result = await response.json();
console.log('>>> [归还] 后端返回=' + JSON.stringify(result));
if (result.success) {
alert('归还成功');
await searchBorrowed();
} else {
alert('归还失败');
alert('归还失败' + (result.message || '未知原因,请查看控制台日志'));
}
} catch (e) {
alert('网络错误');
console.error('>>> [归还] 请求异常:' + e);
alert('网络错误:' + e.message);
}
};
@@ -330,7 +635,8 @@
const response = await fetch('${pageContext.request.contextPath}/api/signup', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params
body: params,
credentials: 'include' // 确保携带 session cookie
});
const result = await response.json();
if (result.success) {

File diff suppressed because it is too large Load Diff

2
WebContent/view/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More