diff --git a/DBBigWorkDesign.drawio b/DBBigWorkDesign.drawio
index da146df..787ba7c 100644
--- a/DBBigWorkDesign.drawio
+++ b/DBBigWorkDesign.drawio
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/instance/config.py b/instance/config.py
index 2d38f03..d0a6511 100644
--- a/instance/config.py
+++ b/instance/config.py
@@ -4,4 +4,5 @@ DATABASE='bigwork'
DATABASE_USER='root'
DATABASE_HOST='localhost'
DATABASE_PASS='lil0,.lil0'
-UPLOADDIR="file_storage/"
\ No newline at end of file
+UPLOADDIR="file_storage/"
+ADMIN_PASS="lolicon"
\ No newline at end of file
diff --git a/sql/trigger.sql b/sql/trigger.sql
index 7c48207..f473dd0 100644
--- a/sql/trigger.sql
+++ b/sql/trigger.sql
@@ -1,6 +1,6 @@
use bigwork;
-DELIMITER ##
drop trigger if exists `trig_create_user_stat`;
+DELIMITER ##
create trigger `trig_create_user_stat`
after insert on user
for each row begin
@@ -8,8 +8,8 @@ create trigger `trig_create_user_stat`
end ##
DELIMITER ;
-DELIMITER ##
drop trigger if exists `trig_delete_user_stat`;
+DELIMITER ##
create trigger `trig_delete_user_stat`
after delete on user
for each row begin
diff --git a/src/db.py b/src/db.py
index 1aeb664..c793434 100644
--- a/src/db.py
+++ b/src/db.py
@@ -38,7 +38,7 @@ def init_db():
# db.executescript(f.read().decode('utf8'))
click.echo("Initializing admin passwd...")
print(len(generate_password_hash("lolicon")))
- db.cursor().execute("insert into admin (passwd) values (%s)", (generate_password_hash("lolicon")))
+ db.cursor().execute("insert into admin (passwd) values (%s)", (generate_password_hash(current_app.config["ADMIN_PASS"])))
db.commit()
click.echo("Initialized database.")
diff --git a/实验报告.assets/DBBigWorkDesign-ER图.drawio.png b/实验报告.assets/DBBigWorkDesign-ER图.drawio.png
new file mode 100644
index 0000000..2b608d3
Binary files /dev/null and b/实验报告.assets/DBBigWorkDesign-ER图.drawio.png differ
diff --git a/实验报告.assets/DBBigWorkDesign-功能模块.drawio.png b/实验报告.assets/DBBigWorkDesign-功能模块.drawio.png
new file mode 100644
index 0000000..aecabff
Binary files /dev/null and b/实验报告.assets/DBBigWorkDesign-功能模块.drawio.png differ
diff --git a/实验报告.assets/DBBigWorkDesign-数据流图.drawio.png b/实验报告.assets/DBBigWorkDesign-数据流图.drawio.png
new file mode 100644
index 0000000..6bf9feb
Binary files /dev/null and b/实验报告.assets/DBBigWorkDesign-数据流图.drawio.png differ
diff --git a/实验报告.assets/DBBigWorkDesign-页面设计.drawio.png b/实验报告.assets/DBBigWorkDesign-页面设计.drawio.png
new file mode 100644
index 0000000..ed9a77b
Binary files /dev/null and b/实验报告.assets/DBBigWorkDesign-页面设计.drawio.png differ
diff --git a/实验报告.md b/实验报告.md
new file mode 100644
index 0000000..410394b
--- /dev/null
+++ b/实验报告.md
@@ -0,0 +1,545 @@
+# 数据库原理实验大作业报告
+
+
李懋良 2020301918
+2022/12/12
+
+## 实验选题简介
+
+本次大作业中,我选择实现的是一个电子书管理系统。设计初衷是为我自己的服务器和几千本电子书写一个可控、可定制的电子书存储和索引服务程序。其主要功能为存储和管理电子书及其相应的文档数据,用户可以上传电子书到服务器上存储、从服务器上搜索并下载自己的电子书。为了迎合本次实验的要求,还为该系统提供了用户登陆控制功能。
+
+## 数据库设计
+
+### 需求分析
+
+#### 用户需求分析
+
+**主要面向用户:**有轻量级云端个人电子书存取需求的用户,比如我
+
+**数据需求:**图书信息、电子书文件信息、服务器统计信息
+
+**功能需求:**1. 上传、存储或删除电子书,具有不同副本管理的功能,同时需要有历史记录来追溯漏洞;2. 搜索并下载电子书;3. 对电子书的进行分类管理,如按照标签、作者、出版社等;4. 可以在电子书上附加评论或注释;5. 多用户和管理员功能。
+
+#### 数据字典-数据处理
+
+- **处理过程名:用户管理**
+ 说明:管理员对用户信息进行基本的CRUD操作
+ 输入:CRUD请求、用户基本信息
+ 输出:D1中的用户信息记录
+- **处理过程名:图书管理**
+ 说明:用户新建、修改、查询、删除图书数据
+ 输入:请求、用户身份、图书数据
+ 输出:D2图书信息
+- **处理过程名:存储管理**
+ 说明:从其他处理过程中接收数据和请求,实际操作电子书在服务器上的存放
+ 输入:D2的图书编号、D1的用户身份、存取操作
+ 输出:D3存储信息
+- **处理过程名:上传下载管理**
+ 说明:用户对指定的文档进行上传和下载
+ 输入:电子文档的文件属性数据、用户的操作请求
+ 输出:D5存取记录、存取操作
+- **处理过程名:笔记管理**
+ 说明:用户在特定的书籍上添加和查看笔记
+ 输入:用户请求、D1用户身份、D2图书编号
+ 输出:D4中的笔记记录
+- **处理过程名:分类信息维护**
+ 说明:在添加书籍时,维护分类和作者信息,方便统计查询
+ 输入:电子文档的图书数据
+ 输出:D6、D7
+
+#### 数据字典-数据流
+
+- **数据流名:管理数据**
+
+ 说明:管理员验证身份,建立用户档案
+
+ 来源去向:管理员 -> P1
+
+ 数据结构: 密码+用户信息表
+
+- **数据流名:用户身份**
+
+ 说明:不同的用户身份进入的处理过程不同。
+
+ 来源去向:P1->P2.1 P1->P2.2
+
+ 数据结构: 用户信息表
+
+- **数据流名:查询请求**
+
+ 说明:通过书名和类别查询库中的图书
+
+ 来源去向:用户 -> P2.1
+
+ 数据结构: 类别/书名,图书信息表
+
+- **数据流名:图书数据**
+
+ 说明:根据电子文档对应的图书情况新建图书记录
+
+ 来源去向:图书 -> P2.1,图书 -> P2.3
+
+ 数据结构: 图书信息表
+
+- **数据流名:文件数据**
+
+ 说明:上传文件时,需要提供文件的属性
+
+ 来源去向:电子文档 -> P3
+
+ 数据结构: 文件属性表
+
+- **数据流名:存取情况**
+
+ 说明:提供存取操作的数据封装,完成实际的数据存取
+
+ 来源去向:P3 -> P2.2
+
+ 数据结构: 存取操作结构
+
+- **数据流名:图书编号**
+
+ 说明:通过图书编号来识别和每种图书相关的数据
+
+ 来源去向:P2.1->P4, P2.1->P2.2
+
+ 数据结构: 类别/书名,图书信息表
+
+- **数据流名:笔记请求**
+
+ 说明:通过图书编号发起添加或者查看笔记的请求。
+
+ 来源去向:用户 -> P4
+
+ 数据结构: 图书编号,笔记信息
+
+#### 数据字典-数据存储
+
+- **数据存储名:用户信息**
+
+ 说明:存放注册用户的相关信息,邮箱需要唯一
+
+ 编号:D1
+
+ 组成:用户编号,用户名,用户邮箱,用户密码,用户空间占用,用户配额,注册日期
+
+ 数据量:不多于10条
+
+ 存取频度:每天100次
+
+ 存取方式:随机检索为主
+
+- **数据存储名:图书信息**
+
+ 说明:电子书的出版相关的信息,ISBN唯一,不包括实际的电子书文档信息
+
+ 编号:D2
+
+ 组成:编号,ISBN,出版社,类型,作者,日期,语言
+
+ 数据量:500条左右
+
+ 存取频度:每天200次
+
+ 存取方式:随机检索和更新
+
+- **数据存储名:存储信息**
+
+ 说明:电子书文档的相关数据,和图书信息密切相关
+
+ 编号:D3
+
+ 组成:副本编号,资源URL,大小,日期
+
+ 数据量:800条左右
+
+ 存取频度:每天300次
+
+ 存取方式:随机检索为主
+
+- **数据存储名:笔记信息**
+
+ 说明:读者对图书发表的笔记和注解
+
+ 编号:D4
+
+ 组成:编号,日期,内容
+
+ 数据量:1600条左右
+
+ 存取频度:每天300次
+
+ 存取方式:随机检索和插入
+
+- **数据存储名:存取记录**
+
+ 说明:记录电子书文档的上传、下载和删除,方便统计和故障查询
+
+ 编号:D5
+
+ 组成:图书副本编号,用户编号,操作类型,日期
+
+ 数据量:2000条左右
+
+ 存取频度:每天300次
+
+ 存取方式:主要是按照时间顺序插入,有时会有全表统计查询
+
+- **数据存储名:类型信息**
+
+ 说明:记录图书的类型,方便统计和查询
+
+ 编号:D6
+
+ 组成:类型编号,类型名称
+
+ 数据量:200条左右
+
+ 存取频度:每天100次
+
+ 存取方式:随机CRUD
+
+- **数据存储名:作者信息**
+
+ 说明:记录图书的作者,方便统计和查询
+
+ 编号:D7
+
+ 组成:作者编号,作者姓名
+
+ 数据量:200条左右
+
+ 存取频度:每天100次
+
+ 存取方式:随机CRUD
+
+#### 数据流图
+
+
+
+### 概念结构设计
+
+#### 实体分析
+
+**实体:**管理员、用户、图书、文件、笔记、类型、作者
+
+**语义描述:**
+
+1. 一个系统里面有多个相互独立的用户,用户拥有多个图书,图书可以对应多个版本的文件,图书可以有多个笔记。一个文件只能对应一本图书。
+2. 系统只有一个管理员,管理员不是用户,只有操作用户账户的权限,不具有对其他信息进行操作的权限。
+3. 一个用户只能管理自己所拥有的图书、文件和笔记
+4. 用户有存储空间配额的限制,上传的文件不能超过配额。
+5. 一本图书可以被分到多个类别里面,一个类里面有多本书;一本书可以有多个作者,一个作者可以写多本书
+
+#### E-R图
+
+
+
+### 逻辑结构设计
+
+#### 转换关系
+
+实体转换:
+
+- 管理员:admin(密码)
+
+ > 系统中只有一个管理员,密码只能通过直接操作数据库修改,这仅作为一个存储项,也不需要主键之类的东西。
+
+- 用户:user(用户ID, 用户名, 用户邮箱, 用户密码, 用户配额, 注册日期)
+
+- 图书:book(图书ID,ISBN,出版社,日期,语言,标题)
+
+- 文件:document(文件ID,资源URL,大小,日期,类型,副本名)
+
+- 笔记:note(笔记ID,日期,内容,标题)
+
+- 类型:type(类型ID, 类型名称)
+
+- 作者:author(作者ID, 作者姓名)
+
+联系转换:
+
+- 管理:管理不直接通过数据表体现,因此不需要添加任何的关系。
+- 拥有:一对多关系,因此在图书里面添加外键用户ID,修改图书关系为book(图书ID,用户ID(**FK ref user**),ISBN,出版社,日期,语言, 标题)
+- 存取:一对多关系,但是由于该联系有自己的属性,所有单独新建一个关系 record(记录ID,时间,操作类型,用户ID,文件URL)。由于这里可能涉及到删除操作,因此使用外键,仅保留存取记录。
+- 对应:一对多关系,直接在文件里面添加外键图书ID,修改文件关系为document(文件ID,图书ID(**FK ref book**),资源URL,大小,日期)
+- 图书-笔记:一对多关系,直接在笔记关系中增加外键,修改关系为note(笔记ID,图书ID(**FK ref book**),日期,内容)
+- 图书-作者:多对多关系,单独建立一个关系book_author(图书ID(**FK ref book**),作者ID(**FK ref author**))
+- 图书-类型:多对多关系,单独建立一个关系book_type(图书ID(**FK ref book**),类型ID(**FK ref type**))
+
+#### 关系模式优化
+
+book_author、book_type两个为全码,无非主属性,必然满足BCNF
+
+其余关系的函数依赖集如下:
+
+- type:`{类型ID->类型名称}`
+- author:`{作者ID->作者姓名}`
+- user:`{用户ID->用户名, 用户ID->用户邮箱, 用户ID->用户密码, 用户ID->用户配额, 用户ID->注册日期}`
+- book:`{图书ID->用户ID, 图书ID->ISBN, 图书ID->出版社, 图书ID->日期, 图书ID->语言, 图书ID->标题}`
+- document:`{文件ID->图书ID, 文件ID->资源URL, 文件ID->大小, 文件ID->日期}`
+- note:`{笔记ID->图书ID, 笔记ID->日期, 笔记ID->内容, 笔记ID->标题}`
+- record:`{记录ID->用户ID, 记录ID->操作类型, 记录ID->时间, 记录ID->文件URL}`
+
+可以看出,他们均为非主属性对码的完全函数依赖,满足BCNF。
+
+#### 其他优化
+
+冗余设计:
+
+- 因为用户可能会经常需要看自己发布的笔记,虽然可以通过先查book表再查note,但是这样会降低查询效率,因此在note关系中添加用户ID。对于document也需要做同样的冗余属性列的添加,以提高某些情况下的查询效率。
+- 建立一个用户的统计数据表,里面存放了用户占用的存储空间、创建的图书数量、种类等信息,可以减少查询时的数据库压力。
+
+安全性设计:
+
+- 数据加密:用户的密码通过sha256的方式存储在数据库中
+- SQL注入:交给框架来完成
+
+完整性约束:
+
+- 用户占用的存储空间不能超过配额,也就是用户的文件关系中,文件大小属性之和不能大于用户的配额。
+- 用户名和用户邮箱均可用来登陆,因此需要保证唯一性
+
+触发器:
+
+- 新建用户时,自动插入用户统计信息
+- 上传和删除文件时,自动统计占用空间
+- 增加图书的标签时,自动插入标签表中不存在的记录
+
+### 物理设计
+
+#### 存储结构
+
+- 存放位置为本地
+- 存储结构为单机关系型数据库MySQL InnoDB,电子书文件存放在磁盘文件系统上
+
+#### 数据存取
+
+- 对于type、author、user这三个表而言,一般只需要通过ID查询,因此无需建立额外的索引优化,直接用主键索引即可。book_author、book_type这两个全码表更是如此。
+- 对于book、document、note、record有对于非主属性的联合和范围查询的需求,主要是对对于类型、作者等属性的联合查询。其中,对于范围较小的属性,如图书的语言、出版社、类型等属性,可以不建立索引。对于标题、日期等范围较大的索引,根据启发式规则建立相应的索引。
+
+### 数据库实现
+
+#### 表设计
+
+**user**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| ------------ | --------- | ---- | ---- | ---- | ----------------- | ---------------- |
+| user_id | int | | N | PK | AUTO_INC | 用户主键ID |
+| user_name | varchar | 200 | N | UNI | / | 用户名 |
+| user_mail | varchar | 200 | N | UNI | / | 用户邮箱 |
+| user_passwd | varchar | 200 | N | | / | 用户密码 |
+| user_limit | int | | N | | / | 存储空间配额(KB) |
+| user_regtime | timestamp | | N | | CURRENT_TIMESTAMP | 注册时间 |
+
+**book**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| -------------- | -------- | ---- | ---- | ----- | -------- | ---------------------------- |
+| book_id | int | | N | PK | AUTO_INC | 图书主键ID |
+| book_name | varchar | 200 | N | INDEX | / | 标题 |
+| book_isbn | varchar | 200 | Y | | NULL | isbn号 |
+| book_publisher | varchar | 200 | Y | | NULL | 出版社 |
+| book_lang | varchar | 20 | Y | | NULL | 语言 |
+| user_id | int | | N | FK | / | 所属用户 |
+| book_author | varchar | 1000 | Y | | NULL | 书籍作者,默认用英文逗号分隔 |
+
+**document**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| -------- | --------- | ---- | ---- | ----- | ----------------- | ------------ |
+| doc_id | int | | N | PK | AUTO_INC | 文档主键ID |
+| doc_name | varchar | 100 | N | INDEX | / | 文档名称 |
+| doc_URL | varchar | 100 | N | | / | 文档存储URL |
+| doc_size | int | | N | | 0 | 文档大小(KB) |
+| doc_date | timestamp | | N | | CURRENT_TIMESTAMP | 上传日期 |
+| doc_type | varchar | 100 | N | | / | 文档类型 |
+| book_id | int | | N | FK | / | 所属的图书id |
+| user_id | int | | N | FK | / | 所属的用户id |
+
+**note**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| ------------ | --------- | ---- | ---- | ----- | ----------------- | ------------ |
+| note_id | int | | N | PK | AUTO_INC | 笔记主键ID |
+| note_name | varchar | 200 | N | INDEX | / | 笔记标题 |
+| note_date | timestamp | | N | | CURRENT_TIMESTAMP | 笔记日期 |
+| note_content | text | | N | | / | 笔记内容 |
+| book_id | int | | N | FK | / | 所属的图书id |
+| user_id | int | | N | FK | / | 所属的用户id |
+
+**record**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| ----------- | --------- | ---- | ---- | ---- | ----------------- | --------------- |
+| record_time | timestamp | | N | PK | CURRENT_TIMESTAMP | 记录主键ID |
+| record_type | varchar | 10 | N | | / | 操作类型 |
+| doc_URL | varchar | 200 | N | | / | 被操作文件的URL |
+| user_id | int | | N | | / | 操作的用户id |
+
+**typetable**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| --------- | -------- | ---- | ---- | ---- | -------- | ---------- |
+| type_id | int | | N | PK | AUTO_INC | 类型主键ID |
+| type_name | varchar | 20 | N | UNI | / | 类型名称 |
+
+**author**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| ----------- | -------- | ---- | ---- | ---- | -------- | ---------- |
+| author_id | int | | N | PK | AUTO_INC | 作者主键ID |
+| author_name | varchar | 100 | N | UNI | / | 作者名称 |
+
+**book_author**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| --------- | -------- | ---- | ---- | ----- | ------ | ---------- |
+| author_id | int | | N | PK,FK | / | 作者主键ID |
+| book_id | int | | N | PK,FK | / | 图书主键ID |
+
+**book_type**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| ------- | -------- | ---- | ---- | ----- | ------ | ---------- |
+| type_id | int | | N | PK,FK | / | 类型主键ID |
+| book_id | int | | N | PK,FK | / | 图书主键ID |
+
+**user_stat**
+
+| 字段名 | 数据类型 | 长度 | 可空 | Key | 默认值 | 含义 |
+| -------------- | -------- | ---- | ---- | ---- | ------ | --------------------------- |
+| user_id | int | | N | PK | / | 用户主键ID |
+| user_usedspace | int | | N | | 0 | 占用的空间 |
+| user_bookcount | int | | N | | 0 | 图书总数 |
+| user_doccount | int | | N | | 0 | 文档总数 |
+| user_notecount | int | | N | | 0 | 笔记统计 |
+| user_limit | int | | N | | 0 | 由于数据库限制而复制的limit |
+
+#### 视图
+
+由于 图书-分类 以及 图书-作者 这两对联系是多对多联系,因此需要分三张表存储,在应用程序编程时,需要写很长的SQL语句,比较不方便。因此建立根据图书ID查询类型ID、根据类型ID查询图书ID的两个视图,方便应用程序编写查询语句。下面是`book`和`type`的转换视图,`book`和`author`的转换同理,就不再列举了。
+
+```sql
+create view `v_book_to_types` as
+ select book_id, typetable.type_id as type_id, type_name
+ from book_type natural join typetable;
+create view `v_type_to_book` as
+ select book_id, book_name,book_isbn,book_publisher,book_lang,
+ book_author,user_id,type_id,type_name
+ from book natural join book_type natural join typetable;
+```
+
+#### 数据库端程序
+
+**触发器**
+
+在该项目中,使用四组触发器来实现以下功能:在新建和删除用户的时候自动维护统计信息表条目,在新建笔记、上传文件、新建图书的时候,自动维护统计信息表中的数据。
+
+```sql
+create trigger `trig_create_user_stat` after insert on user for each row begin
+ insert into user_stat (`user_id`, `user_limit`) values(NEW.user_id, NEW.user_limit);
+end ##
+create trigger `trig_delete_user_stat` after delete on user for each row begin
+ delete from user_stat where user_id=OLD.user_id;
+end ##
+
+create trigger `trig_update_stat_book_ins` after insert on book for each row begin
+ update user_stat set user_bookcount=user_bookcount+1 where user_stat.user_id=NEW.user_id;
+end ##
+create trigger `trig_update_stat_book_del` after delete on book for each row begin
+ update user_stat set user_bookcount=user_bookcount-1 where user_stat.user_id=OLD.user_id;
+end ##
+
+create trigger `trig_update_stat_doc_ins` after insert on document for each row begin
+ update user_stat set user_doccount=user_doccount+1 where user_stat.user_id=NEW.user_id;
+ update user_stat set user_usedspace=user_usedspace+NEW.doc_size where user_stat.user_id=NEW.user_id;
+end ##
+create trigger `trig_update_stat_doc_del` after delete on document for each row begin
+ update user_stat set user_doccount=user_doccount-1 where user_stat.user_id=OLD.user_id;
+ update user_stat set user_usedspace=user_usedspace-OLD.doc_size where user_stat.user_id=OLD.user_id;
+end ##
+
+create trigger `trig_update_stat_note_ins` after insert on note for each row begin
+ update user_stat set user_notecount=user_notecount+1 where user_stat.user_id=NEW.user_id;
+end ##
+create trigger `trig_update_stat_note_del` after delete on note for each row begin
+ update user_stat set user_notecount=user_notecount-1 where user_stat.user_id=OLD.user_id;
+end ##
+```
+
+**存储过程**
+
+1. 在删除用户时,需要同时将该用户创建的标签一同删除,这个过程在客户端实现起来需要经过多条SQL语句才能完成,效率较低。因此将这个操作写成存储过程,在数据库端实现。
+
+```sql
+create procedure `clean_up_type_author`(in uid_in int) begin
+declare done boolean default false;
+declare v_bookid int;
+declare cur cursor for select distinct book_id from book where book.user_id = uid_in;
+declare continue handler for not found set done=true;
+ open cur;
+mainloop: loop
+ fetch cur into v_bookid;
+ if done then
+ leave mainloop;
+ end if;
+ delete from typetable where type_id in (select type_id from book_type where book_id=v_bookid);
+ delete from book_type where book_id = v_bookid;
+ end loop;
+ close cur;
+end ##
+```
+2. 在给图书添加标签分类信息的时候,一般能够获得的数据是图书的编号和分类的名称,但是无法确定该分类是否存在。因此需要写一个根据分类名自动新建不存在分类并将相应数据插入type表和book-type表中。同样的,在客户端完成这一操作需要多条SQL语句,显得十分的不方便,故而写为存储过程。
+
+```sql
+create procedure `add_new_book_type`(in bookid_in int, in typename_in varchar(200)) begin
+declare isnewtype int default 0;
+declare isduplicated int default 0;
+declare v_typeid int;
+ select count(type_name) into isnewtype from typetable where type_name=typename_in;
+ if isnewtype=0 then
+ insert into typetable (`type_name`) values (typename_in);
+ end if;
+ select type_id into v_typeid from typetable where type_name = typename_in;
+ select count(book_id) into isduplicated from book_type where type_id=v_typeid and book_id=bookid_in;
+ if isduplicated=0 then
+ insert into book_type (`type_id`,`book_id`) values (v_typeid, bookid_in);
+ end if;
+end ##
+```
+
+## 程序设计
+
+### 开发环境
+
+- 操作系统:Windows10 22H2
+- 语言:Python3.10、HTML+CSS+JavaScript
+- 数据库:MySQL 8.0.30
+- 工具框架:服务器端为Flask框架+jinja2模板引擎,数据库驱动为PyMySQL;客户端为Web,界面框架为spectre.css。
+
+### 程序结构简述
+
+服务程序功能模块划分如下图所示:
+
+
+
+前端界面的操作逻辑主要分为两个部分:管理员界面,用来新建、删除和查询用户;用户界面,用来查询图书、上传下载电子书文档。可以用过程图简单描述如下:
+
+
+
+## 问题及解决方法
+
+1. SQLite3和MySQL迁移
+
+ 在最开始的时候,为了方便程序的部署,我的程序使用SQLite3作为数据库。但非常不幸的是,老师禁止使用SQLite,因此我不得不将适配了SQLite3的代码迁移到MySQL上。这里遇到了几方面的问题:
+
+ 1. SQLite3语法和MySQL不完全兼容,在数据类型、默认值关键字、存储过程、索引和约束等方面均和MySQL有一定的区别,需要对比两者文档来迁移。
+ 2. pymysql库的接口不完全遵循Python的数据库驱动规范,存在部分功能缺失、相同接口语义不同的问题,需要重新编写这部分的代码
+ 3. pymysql没用SQL脚本执行功能,不能直接用python代码直接初始化数据库,需要手工导入。
+
+2. 打包部署
+
+3. 数据库自动初始化
+
+4. 用户登陆
\ No newline at end of file
diff --git a/表设计.xlsx b/表设计.xlsx
index 9577e0d..8dbc5e0 100644
Binary files a/表设计.xlsx and b/表设计.xlsx differ
diff --git a/设计文档.md b/设计文档.md
index db55ef0..df2bca8 100644
--- a/设计文档.md
+++ b/设计文档.md
@@ -4,8 +4,7 @@
主要面向对象:我自己
-> 数据需求:
->
+数据需求:
- 图书信息
- 统计信息