数据库系统原理课程设计

概述

本报告旨在详细阐述小型网上书店管理系统的设计与实现。该系统通过精心设计的数据库结构、后端逻辑以及前端交互,为用户提供了一个高效、直观且用户友好的在线书店管理平台。系统涵盖了从书籍管理到订单处理、客户管理及供应商关系维护等多个方面,确保了业务流程的高效性和数据处理的准确性。

在技术实现方面,系统采用了Django框架,结合SQLite数据库,提供了强大的后端支持。前端设计采用了HTML、CSS和JavaScript,确保了良好的用户体验和界面的响应性。系统的整体架构遵循了客户端-服务器模式,其中服务器端处理业务逻辑和数据存储,客户端则负责展现数据并与用户交互。实现了相关功能,界面美观,操作简便。

需求分析

系统总体设计要求

系统采用客户端-服务器模式(C/S模式)来执行书店的内部日常处理业务,而顾客则通过互联网进行书籍的订购和查询。为了提高系统性能,业务规则应主要集中在中间层或数据库服务器端。

主要功能需求

该系统的功能需求涵盖供书目录及库存管理、采购管理、客户管理、顾客订单管理与发货管理、供应商管理以及网上浏览查询等多个方面。

在供书目录及库存管理方面,系统需要支持建立和更新书目录,以及新书入库的功能。这包括记录详细的书籍信息如书号、书名、作者(最多四位)、出版社、价格、关键字(最多十个)、封皮和库存量等。同时,还需要考虑丛书管理和库存位置的可视化表示。

采购管理功能包括缺书登记和采购单管理。缺书登记可以通过直接登记、基于库存量的自动记录生成,以及顾客的在线缺书登记实现。采购单管理则涉及根据缺书记录生成采购单,随后的到货处理,库存更新,以及向顾客发送邮件通知。

客户管理是另一核心功能,涉及客户信息的管理和信用等级的管理。客户信息包括网上ID、登录密码、姓名、地址和账户余额等。信用等级分为五级,每级具有不同的折扣和透支权限。信用等级的调整既可以手动由书店管理,也可以自动基于账户余额或累计购书金额进行。

顾客订单管理和发货管理功能包括处理顾客的订单详情,如订单号、订货日期、客户ID、书号、数量、金额、发货地址和发货状态。发货管理需要根据订单的具体情况和客户的信用等级决定是否发货。

供应商管理是系统的重要组成部分,涵盖供应商的基本信息和供货信息,以及供应商发布的书目信息。

最后,网上浏览查询功能允许用户查询客户信息、历史订单、发货信息以及书目信息,支持多种条件和模糊查询。

数据库设计要求

在实现网上书店管理系统时,数据库的设计是至关重要的一环。这不仅要求数据库覆盖所有必选的功能和数据需求,还要求设计能够优化数据存取效率、确保数据一致性和完整性,同时也支持系统的可扩展性和维护性。

  1. 数据表的设计:数据表是数据库的基础。它们需要精心设计,以便有效存储和索引书籍信息、客户数据、订单信息、供应商信息等。数据表的设计应考虑到数据的逻辑结构和物理存储,确保数据的规范化以减少数据冗余和依赖,同时优化查询性能。
  2. 视图的构建:视图可提供数据的逻辑表示,使得用户或系统的其他部分可以更简单、更安全地访问数据。通过视图,可以将复杂的查询封装起来,便于管理和使用,同时也增强了数据安全性和隐私性。
  3. 存储过程和触发器的应用:存储过程用于封装复杂的业务逻辑,可以提高数据处理的效率和一致性。而触发器则用于自动化某些数据库操作,如自动更新库存数据、自动生成采购单等,以确保数据的及时性和准确性。
  4. 索引的创建和优化:合理的索引策略是保证数据库查询性能的关键。索引应该在查询最频繁的列上创建,以加快数据检索速度。同时,需要定期评估和优化索引,以适应数据量的增长和查询模式的变化。
  5. 数据完整性和安全性的保障:设计应包括数据完整性约束,如主键、外键、检查约束等,确保数据的准确性和一致性。同时,安全性措施,如用户权限管理、数据加密,也是不可忽视的部分,以保护数据免受未授权访问和潜在的威胁。
  6. 备份和恢复策略的制定:为了防止数据丢失和系统故障,必须制定有效的数据备份和恢复策略。这包括定期的数据库备份,以及在数据丢失或损坏时能快速恢复的能力。

综上所述,数据库的设计应当全面、细致,能够适应网上书店管理系统的各种需求,同时保证数据的安全、稳定和高效处理。

结论

该网上书店管理系统的需求分析强调了系统功能的全面性和实用性,并特别关注于优化用户体验和系统性能。适当且精确的数据库设计将是实现这些要求的关键所在。

数据库设计

概念结构设计

数据库的ER图如下:

图 3-1 本次设计数据库的ER图

逻辑结构设计

(1)书目(书ID,书名,出版时间,价格,出版社,关键字,存货总量,供书商,丛书号) - 对应表:hust_library_book

(2)库存(库存ID,状态,书ID,存放位置) - 对应表:hust_library_store

(3)作者(作者ID,书ID,作者名) - 对应表:hust_library_write

(4)缺书登记(缺书登记ID,书名,出版社,供书商,数量,登记日期) - 对应表:hust_library_bookShortage

(5)读者(读者ID,用户ID,地址,余额,信用等级) - 对应表:hust_library_reader

(6)订单(票ID,价格,时间,数量,读者ID,描述,地址,状态) - 对应表:hust_library_ticket

(7)供应商(供应商ID,供应商名称,电话号码,供货信息) - 对应表:hust_library_supplier

(8)采购单(采购单ID,书籍ID,采购数量)

  • 对应表:hust_library_purchase

表结构设计

hust_library_book

表 3-1 图书信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 名称 name varchar(150) 书名
3 出版时间 time integer 出版时间
4 价格 price decimal 价格
5 出版社 publish varchar(150) 出版书籍的出版社
6 关键字 keyword varchar(150) 书籍的关键字
7 库存 stock 库存数量
8 供应商 supplier VARCHAR(10) 提供书籍的供应商
9 系列号 seriesNo INT 书籍系列的编号

此表存储了图书的详细信息,包括每本书的唯一标识符、书名、出版时间、价格、出版社、关键字、库存量、供应商和系列号。它是图书库存管理的核心,为书店提供关于其藏书的全面信息。

hust_library_store

表 3-2 图书存储位置表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 状态 state smallint 当前状态
3 书籍编号 book_id integer 书籍的唯一标识符
4 位置 location varchar(150) 物理或逻辑位置

该表展示了图书的存储信息,包括存储位置的唯一标识符、图书的当前状态(如在库、借出等)、图书的唯一标识符以及具体的存储位置。这有助于管理书店内部的物理空间和图书的准确定位。

hust_library_write

表 3-3 作者信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 书籍编号 book_id integer 书籍的唯一标识符
3 作者 writer varchar(150) 书籍的作者

这张表记录了书籍和作者之间的关系。它包括每个记录的唯一标识符、书籍的唯一标识符以及作者的名字。此表对于跟踪书籍的作者非常重要,特别是在处理有多个作者的书籍时。

hust_library_bookShortage

表 3-4 缺书信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 名称 name varchar(150) 书名
3 出版社 publish varchar(150) 出版书籍的出版社
4 供应商 supplier VARCHAR(10) 提供书籍的供应商
5 数量 quantity INT 数量或计数
6 登记日期 registrationDate INTEGER 登记或记录的日期

此表用于记录缺书情况。它包括缺书记录的唯一标识符、书名、出版社、供应商、所需数量和登记日期。这对于管理缺书登记和采购流程至关重要,有助于确保书店能够及时补充库存。

hust_library_reader

表 3-5 读者信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id INTEGER 唯一标识符
2 用户编号 user_id INTEGER 用户的唯一标识符
3 地址 address VARCHAR(300) 物理或电子地址
4 余额 balance DECIMAL(10, 2) 账户余额或财务余额
5 信用等级 credit_rating INTEGER 用户或客户的信用等级

该表专注于读者信息,包括读者的唯一标识符、用户编号、地址、账户余额和信用等级。它对于管理读者账户、追踪借阅行为和实施信用管理策略非常重要。

hust_library_ticket

表 3-6 订单信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 价格 price decimal 价格或费用
3 时间 time datetime 记录的时间
4 数量 quantity smallint 数量或计数
5 读者编号 reader_id integer 读者的唯一标识符
6 描述 description varchar(150) 详细描述或说明
7 地址 address VARCHAR(150) 物理或电子地址
8 状态 state integer 当前状态

这张表记录了与图书借阅或罚款相关的财务交易。它包括交易的唯一标识符、交易金额、交易时间、数量、读者的唯一标识符、交易描述、交易地址和交易状态。此表对于跟踪和管理图书借阅的财务方面非常关键。

hust_library_supplier

表 3-7 供书商信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 编号 id integer 唯一标识符
2 名称 name varchar(30) 名称或标题
3 电话号码 phoneNumber varchar(11) 联系电话号码
4 供货信息 supplyInfo varchar(255) 供应商提供的货物信息

此表存储了供应商的信息,包括供应商的唯一标识符、名称、电话号码和供货信息。它对于管理与供应商的关系、追踪供货来源和维护供应链非常重要。

hust_library_purchase

表 3-8 采购单信息表
序号 数据项名 列名 数据类型 非空 主键 含义
1 采购单ID id integer 采购单的ID
2 书ID bookID integer 采购书籍的ID
3 采购数量 quantity int(4) 采购书籍的数量

此表存储了采购单的信息,包括采购单的唯一标识符、对应书籍的ID、所需书籍的数量。它对于管理与供应商的关系、追踪供货来源和维护供应链非常重要。

auth_user

表 3-9 Django内置用户表
序号 数据项名 列名 数据类型 非空 主键 含义
1 用户 ID id integer 用户的唯一标识符
2 密码哈希 password varchar(128) 用户密码的哈希值
3 上次登录时间 last_login datetime 用户上次登录的时间
4 超级用户 is_superuser bool 用户是否是超级用户
5 用户名 username varchar(150) 用户的登录名
6 last_name varchar(150) 用户的姓氏
7 电子邮件 email varchar(254) 用户的电子邮件地址
8 员工标志 is_staff bool 用户是否是员工
9 活跃用户 is_active bool 用户是否是活跃用户
10 创建日期 date_joined datetime 用户账户创建的日期
11 first_name varchar(150) 用户的名字

用户表采用django内置模型User,结构如上表所示。

表的建立

hust_library_book

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table main.hust_library_book
(
id integer not null primary key autoincrement,
name varchar(150) not null,
time integer not null,
price decimal not null,
publish varchar(150) not null,
keyword varchar(150),
stock,
supplier VARCHAR(10),
seriesNo INT,
check (SeriesNo BETWEEN 1 AND 99)
);

create unique index main.hust_library_book_name_publish_time_price_bb8735ce_uniq
on main.hust_library_book (name, publish, time, price);

hust_library_store

1
2
3
4
5
6
7
8
9
10
11
create table main.hust_library_store
(
id integer not null primary key autoincrement,
state smallint not null,
book_id integer not null references main.hust_library_book
deferrable initially deferred,
location varchar(150) not null
);

create index main.hust_library_store_book_id_bb156e46
on main.hust_library_store (book_id);

hust_library_write

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create table main.hust_library_write
(
id integer not null primary key autoincrement,
book_id integer not null
references main.hust_library_book
deferrable initially deferred,
writer varchar(150) not null
);

create index main.hust_library_write_book_id_89ad20ea
on main.hust_library_write (book_id);

create unique index main.hust_library_write_writer_book_id_39fd11d3_uniq
on main.hust_library_write (writer, book_id);

hust_library_bookShortage

1
2
3
4
5
6
7
8
9
10
11
create table main.hust_library_bookShortage
(
id integer not null
primary key autoincrement,
name varchar(150) not null,
publish varchar(150) not null,
supplier VARCHAR(10) not null,
quantity INT not null,
registrationDate INTEGER not null,
check (Quantity BETWEEN 10 AND 9999)
);

hust_library_reader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table main.hust_library_reader
(
id INTEGER
primary key autoincrement,
user_id INTEGER not null
unique
references main.auth_user
on delete cascade,
address VARCHAR(300) not null,
balance DECIMAL(10, 2) not null,
credit_rating INTEGER not null
);

create index main.hust_library_ticket_reader_id_5c3b20ca
on main.hust_library_ticket (id);

hust_library_ticket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table main.hust_library_ticket
(
id integer not null
primary key autoincrement,
price decimal not null,
time datetime not null,
quantity smallint not null,
reader_id integer not null
references main.auth_user
deferrable initially deferred,
description varchar(150) not null,
address VARCHAR(150) not null,
state integer default 0 not null
);

create index main.hust_library_ticket_reader_id_5c3b20ca
on main.hust_library_ticket (reader_id);

hust_library_supplier

1
2
3
4
5
6
CREATE TABLE hust_library_supplier (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(30) NOT NULL,
phoneNumber VARCHAR(11) NOT NULL,
supplyInfo VARCHAR(255) NOT NULL
);

hust_library_purchase

1
2
3
4
5
6
create table main.hust_library_purchase
(
id integer not null primary key autoincrement,
bookID integer not null,
quantity integer not null
);

auth_user

由Django自动生成,这里只是导出其原始DDL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table main.auth_user
(
id integer not null
primary key autoincrement,
password varchar(128) not null,
last_login datetime,
is_superuser bool not null,
username varchar(150) not null
unique,
last_name varchar(150) not null,
email varchar(254) not null,
is_staff bool not null,
is_active bool not null,
date_joined datetime not null,
first_name varchar(150) not null
);

触发器设计

check_keyword_limit_insert

1
2
3
4
5
6
7
CREATE TRIGGER check_keyword_limit_insert
BEFORE INSERT ON hust_library_book
FOR EACH ROW
WHEN LENGTH(NEW.keyword) - LENGTH(REPLACE(NEW.keyword, '、', '')) >= 9
BEGIN
SELECT RAISE(FAIL, 'Keywords limit exceeded');
END;

此触发器在向 hust_library_book 表中插入新记录之前执行。它的目的是确保新记录的 keyword 字段不超过10个关键词(规定关键词之间用'、'分割)。如果 keyword 字段的超过了这个限制,将引发一个错误,阻止插入操作。

图 3-2 插入时添加大于10个的关键字被触发器终止

check_keyword_limit_update

1
2
3
4
5
6
7
CREATE TRIGGER check_keyword_limit_update
BEFORE UPDATE ON hust_library_book
FOR EACH ROW
WHEN LENGTH(NEW.keyword) - LENGTH(REPLACE(NEW.keyword, '、', '')) >= 9
BEGIN
SELECT RAISE(FAIL, 'Keywords limit exceeded');
END;

此触发器在更新 hust_library_book 表中的记录之前执行。其作用与 check_keyword_limit_insert 触发器类似,旨在确保更新操作不会使 keyword 字段超过10个关键词。如果更新操作违反了这个规则,将阻止更新并显示错误。

图 3-3 更新时添加大于10个的关键字被触发器终止

create_book_shortage_record

1
2
3
4
5
6
7
8
CREATE TRIGGER create_book_shortage_record
AFTER UPDATE OF stock ON hust_library_book
FOR EACH ROW
WHEN NEW.stock <= 1
BEGIN
INSERT INTO hust_library_bookShortage (name, publish, supplier, quantity, registrationDate)
VALUES (NEW.name, NEW.publish, NEW.supplier, 10, strftime('%Y-%m-%d','now'));
END;

此触发器在向 hust_library_loan 表插入新记录之后执行。当新记录的 state 字段的值小于等于1时时,触发器会在 hust_library_bookShortage 表中插入一条新记录,用于自动记录缺书情况。

image-20231229195112062
图 3-4 自动生成缺书登记表

update_credit_rating

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TRIGGER update_credit_rating
AFTER UPDATE OF balance ON hust_library_reader
FOR EACH ROW
BEGIN
UPDATE hust_library_reader
SET credit_rating =
CASE
WHEN NEW.balance < 100 THEN 1
WHEN NEW.balance >= 100 AND NEW.balance < 500 THEN 2
WHEN NEW.balance >= 500 AND NEW.balance < 1000 THEN 3
WHEN NEW.balance >= 1000 AND NEW.balance < 3000 THEN 4
WHEN NEW.balance >= 3000 THEN 5
END
WHERE id = NEW.id;
END;

这个触发器在更新 hust_library_reader 表中的记录之后执行。它的作用是根据账户余额自动调整读者的信用等级。触发器会根据更新的内容重新计算 credit_rating 字段的值。

图 3-5 根据余额自动设计信用等级

视图设计

view_reader_info

1
2
3
4
5
6
7
8
CREATE VIEW view_reader_info AS
SELECT
id AS ReaderID,
user_id AS UserID,
address AS Address,
balance AS Balance,
credit_rating AS CreditRating
FROM hust_library_reader;

这个视图名为 view_reader_info,它从 hust_library_reader 表中选择了读者的基本信息,包括读者的唯一标识符、用户编号、地址、账户余额和信用等级。这个视图可能用于快速访问或展示读者的关键信息,简化了从原始表中检索这些数据的过程。

view_library_books

1
2
3
4
5
6
7
8
9
10
11
12
CREATE VIEW view_library_books AS
SELECT
id AS BookID,
name AS BookName,
time AS PublishTime,
price AS Price,
publish AS Publisher,
keyword AS Keywords,
stock AS Stock,
supplier AS Supplier,
seriesNo AS SeriesNumber
FROM hust_library_book;

view_library_books 视图展示了 hust_library_book 表中的书籍信息,包括书籍的唯一标识符、名称、出版社、价格和库存量。这个视图可能被用来快速获取有关书库存的汇总信息,便于书店员工或客户浏览和查询。

view_library_tickets

1
2
3
4
5
6
7
8
9
10
11
CREATE VIEW view_library_tickets AS
SELECT
id AS TicketID,
price AS Price,
time AS Time,
quantity AS Quantity,
reader_id AS ReaderID,
description AS Description,
address AS Address,
state AS State
FROM hust_library_ticket;

此视图名为 view_library_tickets,它从 hust_library_ticket 表中汇总了与图书借阅或罚款相关的财务交易信息,包括交易的唯一标识符、价格、时间、数量、读者的唯一标识符、交易描述、地址和状态。此视图用于快速查看和分析财务交易,特别是在处理大量的票据或罚款记录时。

存储过程设计

SQLite不像其他数据库(如SQL Server或PostgreSQL)那样原生支持存储过程。在SQLite中,通常使用触发器或用户自定义函数来实现类似存储过程的功能。故存储过程的设计将在Django后端和Bootstrap前端中实现。

后端设计

Django介绍

Django是一个开源的高级Web框架,它让开发者能够快速地构建安全和维护性强的网站。使用Python语言编写,Django遵循MVC(模型-视图-控制器)架构模式,被广泛应用于构建复杂的、数据库驱动的网站。

核心特性

  1. ORM(对象关系映射):允许开发者以Python类的形式操作数据库,而无需直接编写SQL语句,简化了数据库操作。
  2. 安全性:提供多种安全功能,包括防止跨站请求伪造(CSRF)、SQL注入和跨站脚本攻击(XSS)等。
  3. 灵活的URL设计:支持强大的URL路由和页面分发机制。
  4. 可扩展性:Django拥有可重用的应用架构,允许应用在项目间共享和重用。
  5. 自带的后台管理界面:自动生成后台管理界面,方便进行网站内容的管理。
  6. 丰富的库:提供了大量内建的库,支持会话、模板、缓存、中间件等功能。

SQLite介绍

SQLite是一种轻量级的数据库,它是自给自足的、高可靠的、嵌入式的、全功能的公共领域SQL数据库引擎。SQLite是Django默认使用的数据库,它适合于需要轻量级数据库的应用程序,特别是在资源有限的环境中。

特点
  1. 自给自足:SQLite不需要一个单独的服务器进程或操作系统来运行。SQLite数据库是独立于语言和平台的,数据库文件可以在不同系统或程序间轻松地传输。

  2. 无需配置:作为一个嵌入式数据库,SQLite不需要任何配置,这意味着它不需要安装或管理。

  3. 小巧轻便:SQLite的库非常小(几MB),但它提供了一套丰富的数据库操作功能,非常适合轻量级应用程序。

  4. 数据类型的灵活性:SQLite支持动态类型的数据库模式。这意味着可以在单个数据库中存储多种数据类型,并且列的数据类型不是固定的。

  5. 事务的支持:SQLite支持完整的ACID事务,即使在系统崩溃和电源故障的情况下也可以保证数据库的完整性。

  6. 易于维护:SQLite数据库是以单一文件形式存储在磁盘上,易于备份和维护。

  7. 广泛的应用:由于其简单性和高效性,SQLite被广泛用于移动应用、小型到中型网站、桌面应用程序等。

与Django的集成

在Django项目中,默认使用SQLite数据库,它非常适合快速开发、原型设计以及小型应用。Django的ORM系统与SQLite无缝集成,让开发者可以专注于应用的开发,而不需要担心底层的数据库操作细节。

系统架构描述

该系统采用了客户端-服务器(C/S)架构,其中服务器端基于Django框架实现。客户端通过Web浏览器与服务器进行交互,服务器处理客户端的请求,并返回响应数据。Django的MVC模式在此架构中发挥核心作用:模型(Model)负责数据和数据库的交互,视图(View)处理业务逻辑并与用户界面交互,控制器(Controller)部分由Django自身处理,负责将Model和View连接起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
graph LR
subgraph Client ["客户端<br>(Web浏览器)"]
UserInterface[("用户界面")]
end

subgraph Server ["服务器端<br>(Django)"]
Django[("Django<br>应用服务器")]
ORM[("ORM")]
Models[("模型")]
Views[("视图")]
Templates[("模板")]
end

subgraph Database ["数据库"]
SQLite[("SQLite数据库")]
end

UserInterface -- HTTP请求 --> Django
Django -- 业务逻辑处理 --> Views
Views -- 数据请求/响应 --> ORM
ORM -- 数据操作 --> SQLite
Models -- 产生 --> Views
Views -- 返回数据 --> Templates
Templates -- 生成HTML --> UserInterface

style Client fill:#f9f,stroke:#333,stroke-width:2px
style Server fill:#bbf,stroke:#333,stroke-width:2px
style Database fill:#ff9,stroke:#333,stroke-width:2px

图 4-1 系统架构图

系统各个模块之间的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
graph TD
style Django fill:#f9f,stroke:#333,stroke-width:2px
style Models fill:#bbf,stroke:#333,stroke-width:2px
style Views fill:#fbf,stroke:#333,stroke-width:2px
style Templates fill:#bfb,stroke:#333,stroke-width:2px
style DB fill:#ff9,stroke:#333,stroke-width:2px
style Client fill:#fbb,stroke:#333,stroke-width:2px

Django[("Django<br>框架")] -->|MVC模式| Models[("模型<br>(Models)")]
Django -->|MVC模式| Views[("视图<br>(Views)")]
Django -->|MVC模式| Templates[("模板<br>(Templates)")]
Models -->|数据交互| DB[("数据库")]
Views -->|处理逻辑| Models
Views -->|返回响应| Templates
Templates -->|展示界面| Client[("客户端<br>(Web浏览器)")]
图 4-2 模块之间关系

该架构图清晰地描述了Django应用的主要组成部分及其相互关系:

  1. 模型(Models):作为数据层,模型负责与数据库(DB)进行交互。它定义了数据结构,负责存储、检索、更新和删除数据。

  2. 视图(Views):作为逻辑层,视图接收来自用户的请求,并调用相应的模型来处理数据。视图还决定要返回哪种响应或数据。

  3. 模板(Templates):作为表示层,模板负责构建用户界面。它们将视图返回的数据渲染成HTML,用于在客户端(Web浏览器)上展示。

  4. 数据库(DB):Django通常与数据库(如SQLite)配合使用,用于存储应用数据。Django的ORM层使得与数据库的交互更为简便和安全。

  5. 客户端(Client):用户通过Web浏览器与应用交互。用户的请求被发送到服务器,服务器处理这些请求并通过模板返回相应的HTML页面。

整体上,Django的MVC模式确保了应用的高内聚性和低耦合性,使得开发、维护和扩展应用更加方便和高效。

模型设计

在网上书店管理系统中,基于Django框架的模型设计涵盖了多个关键领域,包括罚单、书籍、作者、存储位置、借阅、书籍短缺、读者和供应商等方面。以下是对每个模型的详细介绍:

Ticket(罚单模型)

  • 功能:表示图书馆中的罚单。
  • 字段:
    • price:罚金金额,为小数类型,最多6位数字,其中2位为小数。
    • time:罚单创建的时间,采用日期时间字段。
    • quantity:数量,小整数字段,默认为1。
    • description:罚单描述,长度最大150字符。
    • address:相关地址信息,长度最大150字符。
    • state:罚单的状态,整数字段,默认为0。
    • reader:与User模型的外键关联,代表罚单对应的读者。

Book(书籍模型)

  • 功能:表示图书信息。
  • 字段:
    • name:书名,最大长度150字符。
    • publish:出版社名称,最大长度150字符。
    • time:出版时间,整数类型。
    • price:价格,小数类型,最多6位数字,2位小数。
    • keyword:关键词,最大长度150字符。
    • stock:库存量,小整数类型,默认为0。
    • supplier:供应商信息,最大长度10字符。
    • seriesNo:系列编号,整数类型。
  • 约束:通过元类Meta定义了复合唯一约束,确保每本书的唯一性。

Write(作者模型)

  • 功能:表示书籍的作者。
  • 字段
    • writer:作者名称,最大长度150字符。
    • book:与Book模型的外键关联,表示作者对应的书籍。
  • 约束:通过元类Meta定义了作者和书籍组合的唯一性。

Store(存储位置模型)

  • 功能:表示书籍的存储位置。
  • 字段
    • location:位置信息,最大长度150字符。
    • state:状态信息,小整数类型,默认为1。
    • book:与Book模型的外键关联,表示存储位置对应的书籍。

BookShortage(书籍短缺模型)

  • 功能:记录书籍的短缺情况。
  • 字段
    • name:书名,最大长度150字符。
    • publish:出版社名称,最大长度150字符。
    • supplier:供应商信息,最大长度10字符。
    • quantity:短缺数量,整数类型,带有最小值和最大值验证器。
    • registrationDate:登记日期,整数类型。

Reader(读者模型)

  • 功能:记录图书馆的读者信息。
  • 字段
    • user:与User模型的一对一关系,代表一个用户。
    • address:地址信息,最大长度300字符。
    • balance:账户余额,小数类型,最

多10位数字,2位小数。 - credit_rating:信用等级,整数类型。

Supplier(供应商模型)

  • 功能:记录图书供应商的信息。
  • 字段
    • name:供应商名称,最大长度30字符。
    • phoneNumber:电话号码,最大长度11字符。
    • supplyInfo:供货信息,文本字段。

Purchase(采购单模型)

  • 功能:记录图书供应商的信息。
  • 字段
    • name:供应商名称,最大长度30字符。
    • phoneNumber:电话号码,最大长度11字符。
    • supplyInfo:供货信息,文本字段。

总结

以上模型结构是该网上书店管理系统的数据骨架,不仅涵盖了业务的核心领域,而且通过精心设计的数据结构和关系,保证了系统数据的完整性、准确性和可扩展性。

视图设计

在网上书店管理系统中,基于Django框架的视图设计扮演着处理用户请求和返回响应的关键角色。以下是对每个视图的详细介绍,采用了科学和严谨的语言:

index_view(首页视图)

  • 功能:显示首页。如果用户是管理员,则重定向到管理员界面。
  • 实现:通过检查用户的认证状态和用户组来决定重定向的目的地。

is_admin_view(管理员检查视图)

  • 功能:检查当前用户是否为管理员,并根据结果进行重定向。
  • 实现:使用用户组来判断用户是否属于读者组,从而决定是否跳转到管理员界面。

self_inf_view(个人信息视图)

  • 功能:展示当前登录用户的个人信息。
  • 实现:返回个人信息的HTML模板。

books_view(书籍视图)

  • 功能:根据搜索条件显示书籍列表。
  • 实现:基于用户输入的搜索条件过滤书籍并展示结果。

BookView(书籍详细信息类视图)

  • 功能:显示单本书籍的详细信息。
  • 实现:使用Django的通用类视图DetailView,指定模型为Book和使用的模板。

administrator_view(管理员界面视图)

  • 功能:显示管理员界面。
  • 实现:返回管理员界面的HTML模板。

books_manage_view(书籍管理视图)

  • 功能:管理书籍的添加、编辑和删除操作。
  • 实现:根据搜索条件显示书籍列表,提供书籍管理选项。

reader_manage_view(读者管理视图)

  • 功能:管理读者信息,如编辑和删除读者账户。
  • 实现:使用表单处理读者信息的编辑和更新。

总结

这些视图构成了网上书店管理系统的用户界面和后台逻辑的核心。它们通过处理来自用户的HTTP请求,并与模型进行交互,最后渲染相应的HTML模板,从而为用户提供了一个功能完备、用户友好的网站体验

前端设计

概述

在线书店管理系统的前端设计在用户交互和体验中起着至关重要的作用。它涉及创建网页、样式设置和脚本编写,确保应用程序不仅功能全面,而且直观且视觉上吸引用户。下面是关键部分的介绍:

HTML模板

  • 结构:HTML(超文本标记语言)是前端设计的基础。它为网页提供结构,定义了头部、段落、链接和其他内容等元素。
  • Django集成:Django使用强大的模板引擎,允许动态内容渲染。Django中的HTML模板通常包含模板标签和变量,允许服务器端数据无缝集成到网页中。

CSS样式

  • 美观和布局:级联样式表(CSS)用于控制和定制网页的视觉方面。这包括布局、颜色、字体和不同屏幕尺寸的响应式设计。
  • 框架和预处理器:可能使用CSS框架(如Bootstrap)或预处理器(如SASS)来简化和增强样式过程。

JavaScript和交互性

  • 动态行为:JavaScript用于为网页添加交互性。表单验证、动画和AJAX调用(无需刷新页面即可加载数据)等功能通过JavaScript实现。
  • 库和框架:使用了BootStrap库进行更复杂的交互和状态管理。

响应式设计

  • 移动优先方法:确保网页应用程序在各种设备上(包括桌面、平板和智能手机)都能响应和访问非常重要。
  • 媒体查询:使用CSS媒体查询根据设备屏幕尺寸应用不同的样式规则,增强应用程序的移动响应性。

运行Django服务器

使用下面的命令运行Django服务器(或者使用现代IDE运行):

1
2
3
4
5
virtualenv venv
source ./venv/bin/activate
pip install -r requirements.txt
python3 manage.py migrate
python3 manage.py runserver

访问即可访问图书馆主页,访问即可访问图书馆后台管理界面。

image-20231229192044738
图 5-1 在Pycharm中运行Django服务器

首页

image-20231229192239578
图 5-2 图书管理系统首页

导航栏做了响应式布局,会随使用设备的屏幕尺寸应用不同的样式规则,增强应用程序的移动响应性。通过导航栏可以跳转常用的界面。底部增添了版权信息和联系方式(本人的邮箱),中间部分为欢迎信息。

在用户未登陆时,右上角只会显示欢迎字样;用户登陆后会显示欢迎+用户名的字样;同时,未登陆状态点击导航栏内容会自动跳转到登陆界面。

登陆界面

image-20231229192550779
图 5-3 登陆界面

点击图书信息后跳转登陆界面,会给出提示信息。同时若密码输入不正确会给出错误提示:

image-20231229192647389
图 5-4 密码输入错误

搜索界面

image-20231229192738446
图 5-5 图书搜索界面

进入图书信息界面会显示搜索框,支持搜索想要的书籍。

图书详情界面

点击即可查看图书详情,包含图书的信息:

image-20231229192940133
图 5-6 图书详细信息

同时也可以查看图书的存放位置:

image-20231229192948539
图 5-7 图书位置信息

订单界面设计

点击右上角订单信息可以查看订单:

image-20231229193108567
图 5-8 订单详细信息

管理员前端管理

管理员可以在前端删除书籍,修改书籍信息、作者信息、存放位置信息:

image-20231229193143495
图 5-9 管理员前端删除书籍信息
image-20231229193155063
图 5-10 管理员前端修改书籍信息
image-20231229193202161
图 5-11 管理员前端修改作者信息
image-20231229193212947
图 5-12 管理员前端修改存放信息

后台管理界面

同时,系统也提供了强大的后台管理界面,相较于前端管理增加了更多、更丰富的功能:

image-20231229193228985
图 5-13 后台管理界面首页

后台用户管理

用户分组信息

用户分为两个组:读者组和管理员组,每组拥有不同的权限:

image-20231229193337572
图 5-14 用户分组界面
增加Django用户

管理员可以查看用户信息,点击右上角添加用户可以添加新用户:

image-20231229193445191
图 5-15 用户信息界面

后台新建用户(这里以我的室友为例)

image-20231229193617954
图 5-16 后台增加用户

添加基础信息后,可以增加更详细的信息:

image-20231229193651039
图 5-17 用户详细信息添加界面

同时,可以设置用户的管理权限:

image-20231229193733077
图 5-18 用户管理权限界面

后台信用管理

系统内用户以Reader的形式存在,继承Django内的自带用户,添加更多用户信息如地址、信用余额、信用等级等:

image-20231229193825927
图 5-19 用户信用管理界面

后台书籍管理

管理员可以在后台查看书籍列表:

image-20231229193936530
图 5-20 后台书籍信息列表

同时也可以增添新的书籍:

image-20231229193944598
图 5-20 后台增添新书籍

后台订单管理

管理员可以在后台查看订单信息,并可以增添新的订单信息:

image-20231229193955001
图 5-21 后台增添新的订单信息

后台缺书管理

缺书信息由触发器自动产生:

image-20231229194023848
图 5-21 后台缺书信息查看

当然管理员也可以手动添加缺书信息:

image-20231229202304331
图 5-22 管理员手动添加缺书信息

后台作者管理

管理员可以查看后台的作者信息:

image-20231229194039463
图 5-23 管理员查看作者信息

同时也可以添加作者信息(与书籍绑定): image-20231229202427521

图 5-24 管理员增加作者信息

实验总结与心得体会

在完成这个网上书店管理系统的课程设计中,我经历了从需求分析、数据库设计、后端开发到前端设计的完整开发流程。这个项目不仅锻炼了我的编程能力和系统设计能力,还让我深刻理解了理论知识与实际应用之间的联系。在这个过程中,我遇到了一系列挑战,也获得了宝贵的学习和成长。

在数据库设计阶段,我面临着如何有效组织数据、确保数据一致性和完整性的挑战。特别是在设计复杂的表结构和关系时,我需要不断地回顾和修改ER图,以确保所有的业务需求都能被满足。此外,创建合理的索引来优化查询性能也是一大挑战。

作为一个初次使用Django的开发者,我在理解其MVC架构和ORM系统方面花费了相当的时间。我需要不断地查阅文档和教程,以理解如何在Django中实现业务逻辑、数据处理和用户界面的交互。

在前端设计中,确保页面既美观又实用是一大挑战。特别是在进行响应式设计时,我需要考虑到不同设备和屏幕尺寸,确保用户在任何设备上都能获得良好的体验。此外,使用JavaScript和CSS进行动态内容渲染和样式调整也需要精细的调试和测试。

通过这次项目,我深刻感受到了理论知识与实践应用之间的联系。我不仅应用了在课堂上学到的数据库和编程知识,还学会了如何将这些知识运用到实际的项目开发中。这种实践经验是非常宝贵的,它帮助我更好地理解了课堂上的理论知识。

总的来说,这次网上书店管理系统的课程设计是一次非常宝贵的学习经历。它不仅增强了我的技术能力,也提升了我的问题解决能力和团队合作精神。我相信这些经验和技能将对我的未来学习和职业生涯产生深远的影响。