Gitee 开源项目:e-book resource service system
应用背景描述
随着互联网技术的不断发展,网络上遍布着越来越多的有用或是无用的资源,要在不计其数的资源中筛选出自己亟需的资源,需要耗费较大的精力和非常多的时间。尤其是各种电子图书资源还涉及到知识产权的法律性问题,导致截至目前几乎没有哪个产品能完全满足快速检索电子图书资源和提供相关服务的需求。而现有的各大电子图书网站、系统为了避免侵权问题大部分都选择让网站用户上传对应电子图书的下载链接(电子图书资源一般都还存放在用户的个人云盘中),网站系统负责将所有的链接进行糅合,杂乱无章的整合让普通用户无所适从、望而却步。对于急需查找电子图书的用户,需要到从繁杂的网页中检索出需要的图书的链接,再根据链接跳转到对应的云盘应用进行下载。不得不说,这样的方式对一般用户极其不友好,图书资源也不够规范化、有的是盗版图书、有的甚至不能算是图书、有的下载链接早已失效······ 极大程度浪费了用户的精力和时间。更甚的是,某的网盘下载速度实在堪忧,还得成为会员方可提高下载速度,步骤繁多、代价太大。所以我们的电子图书资源服务系统应运而生。
系统需求分析
本电子图书资源服务系统(e-book resource service system)旨在提供电子图书资源一站式服务,只要成为本系统的用户,就能从系统提供的图书资源中直接检索资源并进行下载,操作简单便捷。当然,为解决各竞品都头疼的知识产权问题,本系统采取了以下两条必要措施:一、系统专门成立了图书管理部门与图书的作者进行协商以解决侵权问题,图书采集员将长期从正规渠道采购各类电子图书资源以满足用户的需求,图书审核员将主要解决图书的知识产权问题等。二、本系统的用户一律采取邀请式注册,即只有拥有本系统的注册码方可注册成为系统用户进而享受相关服务,用户注册和下载图书的过程中也将签署相关协议。
系统功能描述
客户端功能
- 用户注册:用户通过正规渠道获取注册码,填写相关必要信息进行注册,注册过程中需对用户填写的信息进行合法性校验,使用正则表达式和请求服务器验证的方式进行校验,如用户名不允许重复、身份证号及手机号需真实有效等;用户注册前须阅读用户协议
- 用户登录:用户注册成功后输入用户名、密码尝试登入系统,客户端发送请求到服务器验证用户名及密码正确性,验证通过则用户进入服务系统,否则提醒信息错误,告知用户需重新输入或进行注册
- 图书检索:用户可以根据需要的图书信息输入检索条件,从服务器请求对应的图书信息,检索条件可以是书名、作者、关键词、分类或直接检索所有图书,并浏览图书信息;若不存在用户需要的图书信息,友好提示用户可以选择联系客服,阐明自己需要的图书类型,由客服报图书采购部门进行处理,最大程度满足用户的需求
- 图书下载:用户根据第(3)步请求到的图书信息,可每次选择一项图书立即下载,客户端请求服务器传送对应的图书信息到客户端,由用户自定义路径进行保存,图书下载完成
- 图书上传:因部分图书资源较为稀缺,故提供用户可上传自己收藏的图书资源的功能。用户成功上传图书文件,经服务器下载后,由图书管理部门解决知识产权问题,而后上架供其它用户下载
- 下载记录:在用户成功下载图书的同时,自动为用户添加相应的下载记录,用户也可查询自己的历史下载记录
- 收藏夹:用户根据第(3)步请求到的图书信息,若用户不想立即下载图书,为方便日后再次便捷查阅,用户可选择将需要的图书加入到个人收藏夹;收藏夹中页面提供用户下载图书和取消收藏的功能
- 账号管理:账号管理页面用户可以选择修改个人部分信息,如登录密码、手机号等;也可选择注销账户,用户申请注销账户后,服务端将该账户状态修改为冻结状态,若 90 日之内用户未申请解冻,则系统彻底删除该账户的所有信息
- 联系客服:客户端提供用户与平台客服进行实时沟通的功能,用户可与客服沟通解决相关系统使用问题或是申请上架自己想要的图书资源等
服务端功能
- 服务器接收处理客户端所有请求,如用户注册、图书查询、图书下载、查询个人收藏夹及个人下载记录等
- 服务端根据系统角色不同,授予不同的角色不同的权限,角色主要分为系统管理员、图书收集员、图书审核员、图书录入员、图书维护员、注册码管理员等
- 图书收集:由图书收集员从各种正规渠道获取图书资源,包括整理用户上传的资源,分类整理后交由图书审核员解决知识产权问题
- 图书审核:由图书审核员解决电子图书的知识产权问题,与作者联系协商,每一位审核员与作者协商成功后都需要签订相关纸质协议,录入电子记录到数据库相关数据表,以便日后查用
- 图书录入:由图书录入员录入审核员已解决产权问题的图书信息,如 ISBN 号、书名、作者、 出版社、关键词等基本信息,对图书基本信息进行校验
- 图书维护:由图书维护员对图书的基本信息进行维护,如根据图书的分类对图书进行分类管理以方便用户检索、管理图书上下架状态、对图书信息进行更新、管理出版社信息等,所有的操作记录都需要进行保存,以便日后查用
- 注册码管理:由注册码管理员对注册码进行管理,如监测到注册码数量不足时添加注册码、用户成功注销后回收注册码等
- 用户管理:由系统管理员对客户端的普通用户和系统职工的信息进行维护管理,如冻结账户、更新用户信息等
- 数据备份:由系统管理员提供对数据库数据的备份功能
系统功能概览
数据库概念结构设计
实体及属性
根据网上图书系统的实际情况,对于系统数据库的设计需要考虑全面,既要涉及多种业务员数据,又要考虑信息代码表的需要性。根据功能需求分析,整个系统主要包含的实体及其属性分析如下
- 用户:用户编号,用户名,密码,姓名,性别,身份证号,手机号,邮箱,注册码编号,用户状态编号
- 注册码:注册码编号,注册码,注册码状态
- 用户状态:用户状态编号,用户状态状态名称
- 下载记录:下载记录编号,书名,作者,下载时间,用户编号
- 收藏记录:收藏记录编号,书名,作者,分类,关键词,收藏时间,用户编号
- 图书:图书编号,书名,单价,出版社,出版时间,图书分类,关键词,图书状态编号
- 作者:作者编号,作者姓名
- 出版社:出版社编号,出版社名称,固定电话,地址
- 关键词:关键词编号,关键词名称
- 图书类别:类别编号,类别名称,类别描述
- 图书状态:图书状态编号,图书状态名称
- 职工信息:员工编号,姓名,性别,出生年月,手机号,家庭地址,用户密码,职位编号,部门编号,角色编号
- 职位信息:职位编号,职位描述
- 部门信息:部门编号,部门信息
- 角色类型:角色编号,角色描述
实体间关系
- 一个用户有且仅有一个注册码,一个注册码能且仅能供一位用户使用,所以用户与注册码之间是一对一的关系
- 一个用户能且仅能拥有一种用户状态,一种用户状态可以对应多个用户,所以用户与用户状态之间是多对一的关系
- 一个用户可以有多条下载记录,一条下载记录只能对应一个用户,所以用户与下载记录之间是一对多的关系
- 一个用户可以有多条收藏记录,一条收藏记录只能对应一个用户,所以用户与收藏记录之间是一对多的关系
- 一本书可以由多位作者编写,一位作者可以编写多本书,所以图书与作者之间是多对多的关系
- 一本书有且仅有一个出版社,一个出版社可以出版多本书,所以图书与出版社之间是多对一的关系
- 一本书只属于一种图书类别,一类图书可以有多本图书,所以图书与图书类别之间是多对一的关系
- 一本书可以有多个关键词,一个关键词可以描述多本书,所以图书与关键词之间是多对多的关系
- 一本书有且仅有一种图书状态,一种图书状态可以对应多本图书,所以图书与图书状态之间是多对一的关系
- 一个职工可以同时担任多种职位,一个职位可以由多个人担任,所以职工与职位之间是多对多的关系
- 一个职工可在多个部门任职,一个部门可以有多名职工,所以职工与部门之间是多对多的关系
- 一个职工能且仅能对应本系统的一种角色,一种角色可有多名职工,所以职工与角色之间是多对一的关系
- 一条收藏记录只能对应一种图书类别,一种图书类别可以对应多种收藏记录,所以收藏记录与图书类别之间是多对一的关系
ER图
数据库逻辑结构设计
- 注册码:注册码编号,注册码,注册码状态
数据项 | 数据类型 | 主码 | 外码 | 唯一 |
---|
codeId | INT(11) | Y | | |
code | CHAR(8) | | | Y |
codeState | CHAR(8) | | | |
- 用户状态:用户状态编号,用户状态名称
数据项 | 数据类型 | 主码 | 外码 |
---|
userStateId | INT(11) | Y | |
userState | CHAR(8) | | |
- 用户:用户编号,用户名,密码,姓名,性别,身份证号,手机号,邮箱,注册码,用户状态编号
数据项 | 数据类型 | 主码 | 外码 | 唯一 |
---|
userId | INT(11) | Y | | |
username | VARCHAR(32) | | | Y |
password | VARCHAR(32) | | | |
name | VARCHAR(32) | | | |
sex | CHAR(1) | | | |
idCard | CHAR(32) | | | |
phone | CHAR(16) | | | |
mail | VARCHAR(32) | | | |
registerCode | CHAR(8) | | Y | |
userStateId | INT(11) | | Y | |
- 图书状态:图书状态编号,图书状态
数据项 | 数据类型 | 主码 | 外码 |
---|
bookStateId | INT(11) | Y | |
bookState | CHAR(8) | | |
- 图书类别:类别编号,类别名称,类别描述
数据项 | 数据类型 | 主码 | 外码 | 唯一 |
---|
categoryId | INT(11) | Y | | |
category | CHAR(1) | | | Y |
description | VARCHAR(32) | | | |
- 图书:图书编号,ISBN,书名,作者,单价,出版社,出版时间,关键词,保存路径,图书分类,图书状态编号
数据项 | 数据类型 | 主码 | 外码 | 唯一 |
---|
bookId | INT(11) | Y | | |
isbn | CHAR(16) | | | Y |
title | VARCHAR(32) | | | |
author | VARCHAR(32) | | | |
price | DOUBLE | | | |
publisher | VARCHAR(32) | | | |
edition | VARCHAR(32) | | | |
keyword | VARCHAR(32) | | | |
url | VARCHAR(64) | | | |
category | CHAR(8) | | Y | |
bookState | CHAR(8) | | Y | |
- 下载记录:下载记录编号,书名,作者,下载时间,用户名
数据项 | 数据类型 | 主码 | 外码 |
---|
recordId | INT(11) | Y | |
title | VARCHAR(32) | | |
author | VARCHAR(32) | | |
time | DATE | | |
username | VARCHAR(32) | | Y |
- 收藏记录:isbn,书名,作者,关键词,分类,收藏时间,用户名
数据项 | 数据类型 | 主码 | 外码 |
---|
isbn | CHAR(16) | Y | Y |
title | VARCHAR(32) | | |
author | VARCHAR(32) | | |
category | CHAR(1) | | |
keyword | VARCHAR(32) | | |
time | DATE | | |
username | VARCHAR(32) | | Y |
- 作者:作者编号,作者姓名
数据项 | 数据类型 | 主码 | 外码 |
---|
authorId | INT(11) | Y | |
authorName | VARCHAR(32) | | |
- 出版社:出版社编号,出版社名称,固定电话,地址
数据项 | 数据类型 | 主码 | 外码 |
---|
publisherId | INT(11) | Y | |
publisherName | VARCHAR(32) | | |
tel | VARCHAR(32) | | |
address | VARCHAR(64) | | |
- 关键词:关键词编号,关键词名称
数据项 | 数据类型 | 主码 | 外码 |
---|
keywordId | INT(11) | Y | |
keywordName | VARCHAR(32) | | |
- 职工信息:职工编号,姓名,性别,出生年月,手机号,家庭地址,用户密码,职位编号,部门编号,角色编号
数据项 | 数据类型 | 主码 | 外码 |
---|
employeeId | INT(11) | Y | |
name | VARCHAR(32) | | |
sex | CHAR(1) | | |
birthday | DATE | | |
phone | CHAR(11) | | |
address | VARCHAR(64) | | |
password | VARCHAR(32) | | |
positionId | INT(11) | | Y |
departmentId | INT(11) | | Y |
roleId | INT(11) | | Y |
- 职位信息:职位编号,职位描述
数据项 | 数据类型 | 主码 | 外码 |
---|
positionId | INT(11) | | |
positionName | VARCHAR(32) | | |
- 部门信息:部门编号,部门信息
数据项 | 数据类型 | 主码 | 外码 |
---|
departmentId | INT(11) | Y | |
departmentName | VARCHAR(32) | | |
- 角色类型:角色编号,角色描述
数据项 | 数据类型 | 主码 | 外码 |
---|
roleId | INT(11) | Y | |
roleDescription | VARCHAR(32) | | |
数据库生成 SQL 语句
- 建立数据库
CREATE DATABASE ebrss;
USE ebrss;
- 创建用户注册码表
CREATE TABLE `Code`(
`codeId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '注册码编号',
`registerCode` CHAR(8) NOT NULL COMMENT '注册码',
`codeState` CHAR(8) NOT NULL DEFAULT 'unused' COMMENT '注册码状态',
PRIMARY KEY pk_codeId (`codeId`),
UNIQUE INDEX idx_code (`registerCode`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建用户状态表
CREATE TABLE `UserState`(
`userStateId` INT(11) NOT NULL COMMENT '用户状态编号',
`userState` CHAR(8) NOT NULL COMMENT '用户状态',
PRIMARY KEY pk_userStateId (`userStateId`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建用户信息表
CREATE TABLE `User`(
`userId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`username` VARCHAR(32) NOT NULL COMMENT '用户名',
`password` VARCHAR(32) NOT NULL COMMENT '密码',
`name` VARCHAR(32) NOT NULL COMMENT '姓名',
`sex` CHAR(1) NOT NULL COMMENT '性别',
`idCard` CHAR(32) NOT NULL COMMENT '身份证号',
`phone` CHAR(16) NOT NULL COMMENT '手机号',
`mail` VARCHAR(32) NOT NULL COMMENT '邮箱',
`registerCode` CHAR(8) NOT NULL COMMENT '用户注册码',
`userStateId` INT(11) NOT NULL DEFAULT 0 COMMENT '用户状态编号',
PRIMARY KEY pk_userid (`userId`),
UNIQUE INDEX idx_username (`username`),
FOREIGN KEY fk_code (`registerCode`) REFERENCES `Code`(`registerCode`),
FOREIGN KEY fk_userStateId (`userStateId`) REFERENCES `UserState`(`userStateId`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建更新注册码状态触发器
DELIMITER $$
CREATE TRIGGER update_code_state AFTER INSERT ON `User` FOR EACH ROW
BEGIN
UPDATE `Code` SET `codeState` = 'used' WHERE new.`registerCode` = `registerCode`;
END $$
DELIMITER ;
- 创建图书状态表
CREATE TABLE `BookState`(
`bookStateId` INT(11) NOT NULL COMMENT '图书状态编号',
`bookState` CHAR(8) NOT NULL COMMENT '图书状态',
PRIMARY KEY pk_bookStateId (bookStateId)
)ENGINE = INNODB CHARSET = UTF8;
- 创建图书分类表
CREATE TABLE `Category`(
`categoryId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '类别编号',
`category` CHAR(1) NOT NULL COMMENT '类别',
`description` VARCHAR(32) NOT NULL COMMENT '类别描述',
PRIMARY KEY pk_categoryId (categoryId),
UNIQUE INDEX idx_category (`category`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建图书信息表
CREATE TABLE `Book`(
`bookId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '图书编号',
`isbn` CHAR(16) NOT NULL COMMENT '图书isbn',
`title` VARCHAR(32) NOT NULL COMMENT '书名',
`author` VARCHAR(32) NOT NULL COMMENT '作者',
`price` DOUBLE NOT NULL COMMENT '单价',
`publisher` VARCHAR(32) NOT NULL COMMENT '出版社',
`edition` VARCHAR(32) NOT NULL COMMENT '版次',
`keyword` VARCHAR(32) NOT NULL COMMENT '关键词',
`url` VARCHAR(64) NOT NULL COMMENT '图书保存路径',
`category` CHAR(1) NOT NULL COMMENT '类别',
`bookState` CHAR(8) NOT NULL COMMENT '图书状态编号',
PRIMARY KEY pk_bookId (`bookId`),
UNIQUE INDEX idx_isbn (`isbn`),
FOREIGN KEY fk_category (`category`) REFERENCES `Category`(`category`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建图书信息视图
CREATE VIEW view_book AS SELECT isbn, title, author, keyword, category, bookState FROM `Book`;
- 创建下载记录表
CREATE TABLE `Record`(
`recordId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '下载记录编号',
`title` VARCHAR(32) NOT NULL COMMENT '书名',
`author` VARCHAR(32) NOT NULL COMMENT '作者',
`time` DATE NOT NULL COMMENT '下载时间',
`username` VARCHAR(32) NOT NULL COMMENT '用户名',
PRIMARY KEY pk_recordId (`recordId`),
FOREIGN KEY fk_username(`username`) REFERENCES `User`(`username`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建收藏记录表
CREATE TABLE `Favorite`(
`isbn` CHAR(16) NOT NULL COMMENT '图书isbn',
`title` VARCHAR(32) NOT NULL COMMENT '书名',
`author` VARCHAR(32) NOT NULL COMMENT '作者',
`keyword` VARCHAR(32) NOT NULL COMMENT '关键字',
`category` CHAR(1) NOT NULL COMMENT '类别',
`time` DATE NOT NULL COMMENT '收藏时间',
`username` VARCHAR(32) NOT NULL COMMENT '用户名',
FOREIGN KEY fk_isbn (`isbn`) REFERENCES `Book`(`isbn`),
FOREIGN KEY fk_username (`username`) REFERENCES `User`(`username`),
PRIMARY KEY pk_user_book (isbn,username)
)ENGINE = INNODB CHARSET = UTF8;
- 创建作者信息表
CREATE TABLE `Author`(
`authorId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '作者编号',
`authorName` VARCHAR(32) NOT NULL COMMENT '作者姓名',
PRIMARY KEY fk_authorId(`authorId`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建出版社信息表
CREATE TABLE `Publisher`(
`publisherId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '出版社编号',
`publisherName` VARCHAR(32) NOT NULL COMMENT '出版社名称',
`tel` VARCHAR(32) NOT NULL COMMENT '出版社固定电话',
`address` VARCHAR(64) NOT NULL COMMENT '出版社地址',
PRIMARY KEY fk_publisherId (`publisherId`)
)ENGINE = INNODB CHARSET = UTF8;
- 创建图书关键词信息表
CREATE TABLE `Keyword`(
`keywordId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '关键词编号',
`keywordName` VARCHAR以上是关于[数据库系统综合实验]电子图书资源服务系统的主要内容,如果未能解决你的问题,请参考以下文章
Oracle实验课(软件系统开发综合实践)B/S结构;java——图书管理系统
[面向对象与多线程综合实验]数据挖掘系统
20162303 实验五 数据结构综合应用
单片机综合实验 - 05 | 简易电子钟设计
实验五 数据结构综合应用
Python小实验2—产生式系统实验