知识库系统服务器端设计
1 需求描述
1.1 管理员
管理员上传文章,在表单中填入标题 、作者、内容、附件,并选择标签,文章的内容和附件必需至少有一项不为空,同时上传页面提供标签的增删改查。
1.2 用户
用户目前只提供搜索知识库功能,可以搜索标题、内容、作者、附件的名字、(支持搜索附件内容后期再实现),可以选择标签进行限定搜索。
2 数据库设计
2.1 表设计
2.1.1 文章表(article)
字段名 | 数据类型 | 是否必须 | 备注 |
---|---|---|---|
ID | INT(21) | ✓ | 表的唯一标识符 |
CREATED_DATE | DATETIME | ✓ | 创建时间 |
LAST_MODIFIED_DATE | DATETIME | ✓ | 最后一次更新时间 |
title | VARCHAR(255) | ✓ | 标题 |
author | VARCHAR(100) | ✓ | 作者 |
content_id | INT(21) | 内容ID | |
file_id | VARCHAR(255) | 附件ID | |
tag_id | INT(21) | ✓ | 标签ID |
CREATE_BY | VARCHAR(255) | ✓ | 上传的管理员名字 |
2.1.2 内容表(content)
字段名 | 数据类型 | 是否必须 | 备注 |
---|---|---|---|
ID | INT(21) | √ | 内容表唯一标识符 |
CREATED_DATE | DATETIME | √ | 创建时间 |
LAST_MODIFIED_DATE | DATETIME | √ | 最后一次更新时间 |
content | TEXT | √ | 详细内容 |
2.1.3 标签表(tag)
字段名 | 数据类型 | 是否必须 | 备注 |
---|---|---|---|
ID | INT(21) | √ | 标签表唯一标识符 |
CREATED_DATE | DATETIME | √ | 创建时间 |
LAST_MODIFIED_DATE | DATETIME | √ | 最后一次更新时间 |
tag_name | VARCHAR(50) | √ | 标签名 |
2.1.4 文件信息表(files)
字段名 | 数据类型 | 是否必须 | 备注 |
---|---|---|---|
ID | INT(21) | √ | 标签表唯一标识符 |
CREATED_DATE | DATETIME | √ | 创建时间 |
LAST_MODIFIED_DATE | DATETIME | √ | 最后一次更新时间 |
file_name | VARCHAR(255) | √ | 原始文件名 |
file_path | VARCHAR(255) | √ | 文件在服务器或云存储中的路径 |
file_size | BIGINT | √ | 文件大小,以字节为单位 |
file_type | VARCHAR(50) | √ | 文件的 MIME 类型 |
2.1.5 管理员表(sys_manager)
字段名 | 数据类型 | 是否必须 | 备注 |
---|---|---|---|
ID | INT(21) | √ | 管理员表唯一标识符 |
CREATED_DATE | DATETIME | √ | 创建时间 |
LAST_MODIFIED_DATE | DATETIME | √ | 最后一次更新时间 |
manager_name | VARCHAR(255) | √ | 管理员名字 |
user_name | VARCHAR(255) | √ | 管理员登录账号 |
password | VARCHAR(255) | √ | 管理员登录密码 |
3 接口设计
3.1 管理员接口
3.1.1 上传文章
上传文章到知识库。
-
URL
/api/upload/submitArticle
-
Method
POST
-
请求体参数
参数名 类型 描述 title String 文章标题 author String 文章作者 contentId INT 文章内容 ID fileId INT 文章附件ID tags Array 文章标签ID列表 uploadBy String 上传的管理员账户名 -
成功响应
- 状态码:200 OK
- 返回数据:成功上传的文章信息
-
示例
{ "title": "数据库规范", "author": "张三", "content": "这是一篇关于如何使用数据库规范的文章。", "file": "file.pdf", "tags": ["Mysql", "MyBatis"] }
3.1.2 上传附件接口
-
URL
/api/fileUpload
-
Method
POST
-
请求体参数
参数名 类型 是否必须 描述 file MultipartFile √ 待上传的文件 -
成功响应
- 状态码:200 OK
- 返回数据:上传成功的文件信息
-
失败响应
- 状态码:400 Bad Request
- 返回数据:上传失败的错误信息
-
示例
POST /api/upload Content-Type: multipart/form-data Content-Disposition: form-data; name="file"; filename="example.pdf" [文件内容]
3.1.3 删除附件
点击取消上传按钮。
-
URL
/upload/deleteFile?filePath='+encodeURIComponent(filePath)
-
Method
POST
-
求参数
参数名 类型 描述 filePath String 文件存放路径 -
成功响应
- 状态码:200 OK
3.1.4 管理标签
管理知识库中的标签。
-
新增标签
新增一个标签到知识库。
-
URL
/api/tags/add
-
Method
POST
-
求参数
参数名 类型 描述 tagName String 新增的标签 -
成功响应
- 状态码:200 OK
- 返回数据:成功新增的标签信息
-
-
删除标签
从知识库中删除一个标签。
-
URL
/api/tags/:tagId/remove
-
Method
DELETE
-
路径参数
参数名 类型 描述 ID INT 标签ID -
成功响应
- 状态码:200 OK
-
-
修改标签
修改知识库中的一个标签。
-
URL
/api/tags/:tagId/update
-
Method
PUT
-
路径参数
参数名 类型 描述 tagId INT 标签ID -
请求参数
参数名 类型 描述 tagName String 修改后的标签 -
成功响应
- 状态码:200 OK
- 返回数据:成功修改的标签信息
-
3.1.5 将上传的文件信息插入数据库
-
URL:
/api/upload/fileinfo
-
请求方法:
POST
-
请求体参数:
参数名 | 备注 |
---|---|
file_name | 原始文件名 |
file_path | 文件在服务器或云存储中的路径 |
file_size | 文件大小,以字节为单位 |
file_type | 文件的 MIME 类型 |
- 响应:
成功:200
失败:失败信息
3.2 用户接口
3.2.1 搜索知识库
搜索知识库中的文章。
-
URL
/api/search
-
Method
GET
-
请求参数
参数名 类型 描述 keyword String 搜索关键词 isTitle Boolean 标题复选框是否勾选 isContent Boolean 内容复选框是否勾选 isAuthor Boolean 作者复选框是否勾选 isFile Boolean 文件复选框是否勾选 tagIds Array 标签ID列表(可选参数) page Integer 页码(默认为1) pageSize Integer 每页数量(默认为10) -
成功响应
- 状态码:200 OK
- 返回数据:符合搜索条件的文章列表
- 分页信息:总页数、当前页码、每页数量、总文章数
-
示例
GET /api/search?keyword=SpringBoot&isTitle=true&isContent=false&isAuthor=false&isFile=false&tagIds=1,2,3&page=1&pageSize=10
3.2.2 获取文章详情
获取指定文章的详细信息。
-
URL
/api/articles/{articleId}
-
Method
GET
-
路径参数
参数名 类型 描述 articleId Integer 文章ID -
成功响应
- 状态码:200 OK
- 返回数据:指定文章的详细信息
-
示例
/api/articles/123
4 用户搜索实现算法
4.1 模糊查询
-
实现原理:利用MySQL数据库sql语句中的like关键字实现,特别是
LIKE
配合通配符%
和_
来进行模式匹配查询。 -
优缺点:
优点 :-
灵活性强:模糊匹配通过
LIKE
操作符和通配符(如%
和_
)提供强大的查询灵活性,能够根据部分信息查找记录,这对于搜索不完全确定的数据非常有用。 -
简单易用:对于基本的模糊查询,使用
LIKE
操作符非常直观和简单,无需复杂的SQL知识即可上手。 -
广泛适用:作为SQL标准的一部分,模糊匹配几乎被所有数据库管理系统支持,包括MySQL,这使得它成为一种普遍的查询手段。
缺点 :
- 结果可能不精确:模糊匹配可能返回大量相关性较低或不完全匹配的结果,用户需进一步筛选,这可能影响用户体验。
- 不支持复杂模式匹配:尽管
LIKE
和基本正则表达式能处理简单模式,但对于更复杂的文本模式匹配需求,它们的功能较为有限。
-
-
重要代码:
SELECT
a.ID as id,
a.title as title,
a.author AS author,
f.file_name AS file_name,
f.file_path AS file_path,
c.content AS content,
a.tags as tags
FROM
article a
LEFT JOIN
file_info f ON a.file_id = f