# SmartLibrary **Repository Path**: Mercury_blue/SmartLibrary ## Basic Information - **Project Name**: SmartLibrary - **Description**: AI智能图书馆是一个基于 Gin、Gorm、Mysql、Docker等技术栈、集成了人工智能技术的高度自动化图书管理平台。采用了主流的互联网技术架构、用户友好的界面设计,上手简单、部署快速,拥有完整的功能介绍、接口文档、部署文档、错误文档等,代码完全开源,适合新手从零搭建、二次开发 - **Primary Language**: Go - **License**: MIT - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2024-07-17 - **Last Updated**: 2025-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, Gin ## README # SmartLibrary ### 项目介绍 AI智能图书馆是一个基于 Gin、Gorm、Mysql、Docker 等技术栈的自动化图书管理平台,系统有借阅用户、图书管理员、系统管理员三种角色,包含图书管理、公告留言管理、用户管理、AI在线推荐等多种功能。项目开发过程中采用了符合 Go 语言哲学的分层架构。系统界面设计简洁明了、上手简单、部署快速,拥有完整的功能介绍、接口文档、部署文档、错误文档等,代码完全开源,适合新手从零搭建、二次开发 本系统旨在通过智能算法为用户提供个性化的图书推荐服务,并允许图书管理员和系统管理员高效地管理图书资源和用户借阅活动。项目亮点: - **AI驱动的个性化推荐**:利用科大讯飞星火模型,能够根据用户提供的偏好信息,智能推荐图书,提升用户体验 - **高效的条件筛选功能**:用户可以在图书列表中通过多种条件(如作者、图书编号、图书描述等)快速筛选出感兴趣的图书,简化了查找过程 - **全面的图书管理功能**:图书管理员可以通过系统轻松管理用户的借阅证和借阅关系,实现借阅流程的规范化和数据化 - **灵活的图书添加机制**:系统管理员可以方便地添加新图书到系统,包括图书的详细信息和元数据,确保图书资源的更新和丰富 ### 目录结构 ``` SmartLibrary ├── api -- 定义通用的响应方法、参数结构体等 ├── cmd -- 项目启动相关文件 ├── config -- 配置文件,分为本地环境和生产环境 ├── docs -- swagger 存放目录 ├── internal -- 核心业务逻辑,包括 HTTP 服务、DB 操作等 ├── pkg -- 第三方包与相关方法存放目录 ├── storage -- 存放日志文件 └── test -- 存放测试相关代码 ``` 项目架构以 https://github.com/go-nunu/nunu 为基础 ### 技术选型 | 技术 | 说明 | 官网 | | ---------- | ------------------------------------------------------------ | --------------------------------------- | | Gin | Gin是一个极简和高效的Web框架,具有路由、JSON验证等功能,机制灵活且易于扩展 | https://github.com/gin-gonic/gin | | Gorm | 专用于Golang的ORM库,支持多种数据库,提供简单的操作接口和丰富的查询功能 | https://github.com/go-gorm/gorm | | Wire | 一个用于依赖注入的工具,使得Go应用程序的构建更加灵活和可测试 | https://github.com/google/wire | | Viper | 一个灵活的配置管理库,支持多种格式的配置文件,如JSON、YAML和ENV等 | https://github.com/spf13/viper | | Zap | 一个高效且具有结构化日志功能的日志库,适用于高性能应用 | https://github.com/uber-go/zap | | Golang-jwt | 用于创建和解析JSON Web Tokens (JWT)的库,支持多种算法 | https://github.com/golang-jwt/jwt | | Go-redis | 一个功能丰富的Redis客户端,支持各种Redis特性,包括集群、发布/订阅等 | https://github.com/go-redis/redis | | Testify | 一个Go语言的测试工具包,提供丰富的断言功能和模拟功能,简化测试代码编写 | https://github.com/stretchr/testify | | Sonyflake | 一个Twitter Snowflake的实现,生成唯一的ID,适用于分布式系统 | https://github.com/sony/sonyflake | | Gocron | 一个简单的Go语言定时任务调度库,支持Cron风格的调度 | https://github.com/go-co-op/gocron | | Go-sqlmock | 用于Go测试的SQL数据库模拟库,可以模仿数据库的行为而不需要真实的数据库 | https://github.com/DATA-DOG/go-sqlmock | | Gomock | 一个用于Go的Mock生成工具,帮助开发者在测试中创建模拟对象 | https://github.com/golang/mock | | Swaggo | 用于生成Swagger API文档的工具,可以自动生成API文档并支持多种格式的输出 | https://github.com/swaggo/swag | | Nginx | 一款高性能的HTTP和反向代理服务器,广泛应用于负载均衡和静态文件服务 | https://nginx.org | | Websocket | 实现了WebSocket协议的库,用于支持实时、双向通信 | https://github.com/gorilla/websocket | | MySQL | 关系型数据库管理系统,广泛应用于Web应用程序和企业级应用程序 | https://www.mysql.com/cn | | Docker | 一个开源的容器化平台,用于自动化应用程序的部署、扩展和管理 | https://docs.docker.com/desktop/ | | 讯飞星火 | 一个低延迟、功能丰富、接入简单的大模型 | https://www.xfyun.cn/doc/spark/Web.html | ### 开发工具 | 工具 | 说明 | 官网 | | ------- | ------------------------ | -------------------------------- | | GoLand | Golang开发工具 | https://www.jetbrains.com/go/ | | DBeaver | 开源的通用数据库管理工具 | https://dbeaver.io | | Apifox | API文档与测试平台 | https://apifox.com/ | | Typora | Markdown编辑器 | https://typoraio.cn/ | | Git | 版本控制系统 | https://git-scm.com/ | | 宝塔 | 服务器管理面板 | https://www.bt.cn/new/index.html | ### 部署 #### 环境搭建 在进行部署前,必须先下载必须的依赖,搭建好环境后编写配置文件 - Go 1.20+:https://golang.google.cn/blog/go1.20 - MySQL 5.7+/8.0+:https://www.mysql.com/downloads/ - Redis 5.0+:https://redis.io/download/ - Git:https://git-scm.com/downloads 环境准备完成后,就要拉取项目,编写配置文件 使用 Git 拉取项目: ```bash git clone https://gitee.com/Mercury_blue/SmartLibrary.git ``` 在项目的 config 目录下有配置文件 `prod.yml`,对应生产环境。项目默认使用 `local.yml`,需要把 `prod.yml` 复制到相同目录下命名为 `local.yml` 使用 `go run ./cmd/server -conf=config/prod.yml` 可以指定启动项目时使用哪个配置文件 配置文件格式如下,以 `local.yml` 为示例 ```yaml env: local # 本地开发环境 http: host: localhost port: 8000 # 数字签名相关密钥 security: api_sign: app_key: 123456 app_security: 123456 jwt: # jwt 密钥 key: QsYjsIruThlAkrfB89fw8prOaObmrch8 data: db: user: driver: mysql # 分别替换为 MySQL 的用户名、密码、地址、端口号、数据库名称 dsn: username:psssword@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local redis: # 替换为 Redis 实际地址 addr: 127.0.0.1:6379 # 替换为 Redis 实际密码 password: "" db: 0 read_timeout: 0.2s write_timeout: 0.2s # 日志文件相关配置,分别配置日志级别、编码方式、存储路径、最大文件数量、保存天数、最大尺寸、是否启用压缩 log: log_level: debug encoding: console # console or json log_file_name: "./storage/logs/server.log" max_backups: 30 max_age: 7 max_size: 1024 compress: true # AI 相关配置 chat: host_url: wss://spark-api.xf-yun.com/v1.1/chat app_id: xxxxxx api_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx api_key: xxxxxxxxxxxxxxxxxxxxxxxx ``` 比较重要的有 MySQL 的配置和 AI接口相关key、密钥的配置 ##### MySQL 配置 进入项目的 database 目录下,执行 install.sql 脚本创建数据库和所需表结构,如有需要,可以执行 demo.sql 脚本,插入示例数据 执行完成后,把 MySQL 配置项对应的用户名、密码、数据库名等替换为实际的,即可完成 MySQL 的相关配置 ##### 科大讯飞星火模型配置 进入讯飞星火大模型官网:https://xinghuo.xfyun.cn/spark 完成登录 之后进入讯飞开放平台:https://console.xfyun.cn/services/cbm?from=desk 首先创建应用,输入对应的应用名称、应用分类和功能描述 ![image-20240810214927777](./docs/image/image-20240810214927777.png) 创建应用之后,按提示要求进行实名认证 ![image-20240810215225487](./docs/image/image-20240810215225487.png) 实名认证之后,可以免费使用 Spark Lite 模型,使用其他付费模型也一样,申请完成后,把对应的 APPID、APISecret、APIKey 和接口地址写入到配置文件中 ![image-20240810215326897](./docs/image/image-20240810215326897.png) #### 本地部署 首先要确保环境已经搭建完成,MySQL 有对应的表、主机上有 Go 1.20 以上的环境,并且项目已经拉取完毕 以 GoLand 开发工具做演示: 打开 GoLand,点击 OPEN,导入拉取好的项目 ![image-20240810215911014](./docs/image/image-20240810215911014.png) 拉取完项目后,点击左下角的 Terminal 打开终端 ![image-20240810220015445](./docs/image/image-20240810220015445.png) 在终端中输入 `go mod tidy` 自动下载依赖项 ![image-20240810220123614](./docs/image/image-20240810220123614.png) 依赖项下载完毕后,使用 `go run ./cmd/server` 运行项目,或者使用 `go build ./cmd/server` 编译成可执行文件后再启动项目 ![image-20240812095447798](./docs/image/image-20240812095447798.png) 打开浏览器,输入 `127.0.0.1:8000/ping` ![image-20240812095544708](./docs/image/image-20240812095544708.png) 看到上图示例结果,说明本地部署完成 #### Linux下的Docker部署 首先确保已经安装了 docker ```bash docker -v ``` 若正常输出版本号说明已经安装 ##### 拉取项目 如果安装了 git,则执行以下命令 ```bash git clone https://gitee.com/Mercury_blue/SmartLibrary.git /tmp ``` 如果没有安装 git,需要手动下载项目,通过 ssh 远程连接工具或者其他方法把项目文件夹放到 `/tmp` 下 ##### 换源 国内是访问不到 docker.io 的,在运行 dockerfile 构建镜像之前,需要先换源 可以使用阿里的镜像加速:[容器镜像服务 (aliyun.com)](https://cr.console.aliyun.com/cn-wuhan-lr/instances/mirrors) 使用阿里加速时,一些镜像可能拉取不下来,比如 golang:1.20-alpine,这时候可以用其他的镜像源 暂时稳定且速度快的有 `rainbond` 镜像源 使用方法: 1、直接加前缀获取 Docker Hub 镜像 ```bash docker pull docker.rainbond.cc/library/golang:1.20-alpine ``` 2、配置镜像加速器 ```bash tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://docker.rainbond.cc"] } EOF systemctl daemon-reload systemctl restart docker ``` ##### 构建镜像 进入到 dockerfile 所在位置 ```bash cd /tmp/SmartLibrary ``` 执行 docker build ```bash docker build -t smartlibrary:v1 . ``` 第一次运行需要下载包依赖和编译,会很漫长 构建过程中不报错,完成后执行 ```bash docker images ``` 如果能看到构建好的镜像,说明构建成功 ```bash REPOSITORY TAG IMAGE ID CREATED SIZE smartlibrary v1 bb78ff663970 4 minutes ago 39.3MB ``` ##### 启动容器 ```bash docker run -d --name smartlibrary -p 8000:8000 --restart unless-stopped smartlibrary:v1 ``` 启动完成后,执行 ```bash curl localhost:8000/ ``` 看到结果: ```bash {"code":200,"message":"ok","data":{"<(^-^)>": "Thank you for using SmartLibrary!"}} ``` 说明部署成功 ### 接口文档 详细见:[SmartLibrary 接口文档](https://gitee.com/Mercury_blue/SmartLibrary/blob/develop/docs/api_documentation.md) ### 错误文档 详情见:[SmartLibrary 错误码文档](https://gitee.com/Mercury_blue/SmartLibrary/blob/develop/docs/error_codes.md)