https://github.com/viogami/favani
FavAni,基于神经网络推荐算法,找到你最喜欢的动画!
https://github.com/viogami/favani
bangumi go grpc pytorch vue3
Last synced: 6 months ago
JSON representation
FavAni,基于神经网络推荐算法,找到你最喜欢的动画!
- Host: GitHub
- URL: https://github.com/viogami/favani
- Owner: viogami
- Created: 2024-01-02T09:07:06.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-04-02T21:05:06.000Z (almost 2 years ago)
- Last Synced: 2025-10-02T15:36:44.554Z (6 months ago)
- Topics: bangumi, go, grpc, pytorch, vue3
- Language: Vue
- Homepage: http://fa.viogami.me
- Size: 5.56 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
# FavAni
FavAni,基于神经网络推荐算法,找到你最喜欢的动画!
前端使用 Vue3 和 Element Plus 进行构建,让你在使用该工具的同时享受良好的用户体验。
后端使用golang的GIN框架,简洁高效,性能卓越,打包main文件一键服务器端部署。
图算法依赖pytorch,处理为接口独立部署,通过grpc和此后端进行通信。
使用【/routes】路由可查看后端全部接口 --> http://faapi.viogami.me/routes
你可以访问它的 GitHub 仓库地址:FavAni
## 首页面预览

## 前言
个人开发的基于 BangumiAPI 执行推荐算法的数据分析网站。
调用 Bangumi的 API 实现数据检索,并且构建知识图谱。使用jwt鉴权,并自动登录。
后端 RestfulAPI ,通过 Gin 实现。接入 gorm 使用 mysql ,接入鉴权中间件。
算法后端存放知识图谱和用户的收藏信息,每个用户的收藏用来构建子图,使用图卷积神经网络(GCN)并引入注意力机制实现推荐。
grpc服务使用redis缓存结果,高速访问。
## 实现细节
- 前端界面设计
- 后端api接口设计
- 登录注册功能
- jwt鉴权,根据token有效与否自动登录
- 数据库表设计
- 基于bangumi构建知识图谱
- 用户收藏构建子图,执行推荐算法
- grpc通信
- redis缓存grpc请求和结果,并对部分接口使用消息队列实现并发访问稳定性。
- docker文件编写
## 快速上手
演示地址Demo
使用【/routes】查看后端全部接口 --> http://faapi.viogami.me/routes
python的gcn模型接口部署在9999端口
## 文件夹解释
- asserts: 存放必要且无法打包至可执行文件的外部文件
- auth : 鉴权相关文件,目前为jwt
- config:定义配置文件格式并存放配置文件,用于上线灵活修改项目
- database: 定义数据库模型,以及创建mysql和redis
- middleware:定义中间件,包含中间件函数
- pb:定义grpc的protoc文件
- repos:仓库的接口文件,每个数据库表对应一个仓库
- server:启动服务,包括mysql,redis,grpc等
- web:前端文件夹
## grpc说明
本后端做grpc客户端,gcn模型处理代码用py编写,做grpc的服务端。
协议文件编写在`proto/gcn.proto`中
### python服务端简要代码
```python
import grpc
from concurrent import futures
from proto import gcn_pb2_grpc, gcn_pb2
class GCNServicer(gcn_pb2_grpc.GCNServiceServicer):
def ProcessGraph(self, request, context):
# Process graph data using GCN and return result
# example:
# return gcn_pb2.GCNResult(node_scores={"node1": 0.5, "node2": 0.8})
def server():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
gcn_pb2_grpc.add_GCNServiceServicer_to_server(GCNServicer(), server)
server.add_insecure_port('[::]:9999')
server.start()
print('gRPC 服务端已开启,端口为9999...')
server.wait_for_termination()
if __name__ == '__main__':
server()
```