Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
536a1ca
docs:更正README
cagoya Oct 24, 2025
ac73f34
add:添加下载图片功能
cagoya Oct 24, 2025
9932c85
docs:基本完成设计报告
cagoya Oct 24, 2025
c7c7130
docs:更新设计文档
cagoya Nov 19, 2025
776b300
remove:移除报告
cagoya Nov 22, 2025
666d20d
add:添加docker配置
cagoya Nov 22, 2025
02110b7
add:在ci中添加构建docker镜像
cagoya Nov 22, 2025
46a46b3
fix:去除缓存服务
cagoya Nov 26, 2025
9716d42
add:调整后端api接口
cagoya Nov 28, 2025
2b55b30
test:修正后端测试
cagoya Nov 28, 2025
379db01
add:调整后端接口
cagoya Nov 28, 2025
c63317d
add:统一前端风格
cagoya Nov 28, 2025
15f8d94
add:更换数据库为PostgreSQL
cagoya Nov 28, 2025
9eeec07
fix:修正cicd
cagoya Nov 28, 2025
422a8aa
style:格式化go代码
cagoya Nov 28, 2025
e046aa9
add:初步尝试mcp
cagoya Dec 1, 2025
f9f01b3
add:添加模型
cagoya Dec 1, 2025
4de2124
remove:暂时移除测试
cagoya Dec 1, 2025
a6d9bd8
add:在创建和更新图片时为其创建向量
cagoya Dec 1, 2025
9d177b4
add:实现mcp示例
cagoya Dec 1, 2025
84f7da9
add:基本完成后端编码
cagoya Dec 2, 2025
89e3955
test:完成测试
cagoya Dec 2, 2025
bd4bbab
test:完成集成测试
cagoya Dec 2, 2025
3fcf630
add:完成前端基础功能
cagoya Dec 2, 2025
ad33709
fix:添加触发延迟,减轻编辑图片时预览渲染负担
cagoya Dec 2, 2025
edad3ab
fix:修复mcp server查询为空时的bug
cagoya Dec 2, 2025
7a52146
fix:修复CICD
cagoya Dec 2, 2025
2f00b1e
add:删除ci中的单元测试
cagoya Dec 2, 2025
049661c
refactor:修改与ai对话为websocket接口
cagoya Dec 2, 2025
a741425
add:初步完成ai对话搜图
cagoya Dec 2, 2025
d1a0450
add:美化对话页面
cagoya Dec 2, 2025
556fd15
add:提高前端性能,尤其是移动端的性能
cagoya Dec 3, 2025
a246071
fix:修复用户修、删图片导致的ai回复中图片不存在
cagoya Dec 3, 2025
d0a7581
add:增加前端的403处理,支持刷新前端信息
cagoya Dec 3, 2025
5cab44b
add:添加到期自动解封功能
cagoya Dec 3, 2025
93df3f9
fix:修复ci
cagoya Dec 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 18 additions & 27 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ jobs:
with:
go-version: '1.24'

- name: Install and configure MySQL
- name: Install and configure PostgreSQL
run: |
docker pull mysql
docker pull postgres
docker run -d \
--name mysql-server \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD="123456" \
mysql
--name postgres-server \
-p 5432:5432 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=123456 \
-e POSTGRES_DB=image_hub \
postgres
docker ps

- name: Install and configure Redis
Expand All @@ -31,6 +33,15 @@ jobs:
-e REDIS_PASSWORD="123456" \
redis
docker ps

- name: Install and configure Qdrant
run: |
docker pull qdrant/qdrant
docker run -d \
--name qdrant-server \
-p 6334:6334 \
qdrant/qdrant
docker ps

- name: Download Go dependencies
working-directory: ./server
Expand All @@ -56,24 +67,4 @@ jobs:
run: |
gofmt -l . | grep -e ".go" && exit 1 || exit 0
go install golang.org/x/tools/cmd/goimports@latest
goimports -l . | grep -e ".go" && exit 1 || exit 0

- name: Test with coverage
working-directory: ./server
run: |
go test -coverpkg=./model,./service -v -cover -coverprofile=coverage.out ./test/...

- name: Generate HTML report
working-directory: ./server
run: |
go tool cover -html=coverage.out -o coverage.html

# 保存原始覆盖率数据
- name: Upload coverage data
uses: actions/upload-artifact@v4
with:
name: coverage-data
path: |
server/coverage.out
server/coverage.html
retention-days: 30
goimports -l . | grep -e ".go" && exit 1 || exit 0
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@
.cursor

# 图片数据
data/
data/

# 需求文档
assignment.pdf
69 changes: 61 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@
<img src="https://img.shields.io/badge/MCP-integration-yellow"/>
</div>

<div align=center>
<img src="https://img.shields.io/badge/gin-1.10-blue"/>
<img src="https://img.shields.io/badge/vue-3.5.13-green"/>
<img src="https://img.shields.io/badge/MCP-integration-yellow"/>
</div>

## 简介

### 功能
Expand All @@ -32,7 +26,6 @@
- 数据库:MySQL + Redis
- 鉴权:JWT

## 本地开发指南
## 本地开发指南

### clone 本项目
Expand All @@ -51,6 +44,13 @@ docker pull mysql:latest
docker run -d --name mysql-server -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" mysql
```

### 安装Redis

```bash
docker pull redis
docker run -d --name redis-server -p 6379:6379 redis
```

### 启动后端

```bash
Expand All @@ -73,4 +73,57 @@ npm install
npm run dev
```

docker run --name redis -d -p 6379:6379 -e REDIS_PASSWORD="123456" redis:latest
## Docker 部署指南

### 使用 Docker Compose 一键部署

项目已配置好 Docker Compose,可以一键启动所有服务(MySQL、Redis、后端、前端)。

```bash
# 在项目根目录执行
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止所有服务
docker-compose down

# 停止并删除数据卷(注意:会删除数据库数据)
docker-compose down -v
```

### 服务访问地址

- **前端**: http://localhost:5173
- **后端 API**: http://localhost:8888/api
- **MySQL**: localhost:3306
- **Redis**: localhost:6379

### 单独构建镜像

如果需要单独构建前后端镜像:

```bash
# 构建后端镜像
cd server
docker build -t imagehub-backend:latest .

# 构建前端镜像
cd web
docker build -t imagehub-frontend:latest .
```

### 环境变量配置

后端服务支持通过环境变量 `CONFIG_FILE` 指定配置文件,默认为 `server.yaml`。Docker 环境中会自动使用 `docker.yaml` 配置,该配置已设置好容器间的服务名称(mysql、redis)。

### 数据持久化

Docker Compose 已配置数据卷持久化:
- MySQL 数据存储在 `mysql_data` 卷中
- Redis 数据存储在 `redis_data` 卷中
- 后端上传的图片和日志通过挂载目录持久化
30 changes: 0 additions & 30 deletions db.sh

This file was deleted.

82 changes: 82 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
version: '1.0'

services:
# PostgreSQL 数据库服务
postgres:
image: postgres:latest
container_name: imagehub-postgres
restart: unless-stopped
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "123456"
POSTGRES_DB: image_hub
TZ: Asia/Shanghai
ports:
- "5432:5432"
networks:
- imagehub-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

# Redis 服务
redis:
image: redis:latest
container_name: imagehub-redis
restart: unless-stopped
command: redis-server --requirepass 123456
ports:
- "6379:6379"
networks:
- imagehub-network
healthcheck:
test: ["CMD", "redis-cli", "-a", "123456", "ping"]
interval: 10s
timeout: 3s
retries: 5

# 后端服务
backend:
build:
context: ./server
dockerfile: Dockerfile
container_name: imagehub-backend
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "8888:8888"
volumes:
- ./server/public:/app/public
- ./server/log:/app/log
environment:
- TZ=Asia/Shanghai
- CONFIG_FILE=docker.yaml
networks:
- imagehub-network

# 前端服务
frontend:
build:
context: ./web
dockerfile: Dockerfile
container_name: imagehub-frontend
restart: unless-stopped
depends_on:
- backend
ports:
- "5173:5173"
volumes:
- ./web:/app
- /app/node_modules
networks:
- imagehub-network

networks:
imagehub-network:
driver: bridge
20 changes: 20 additions & 0 deletions mcp/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module mcp_server

go 1.24.5

require (
github.com/modelcontextprotocol/go-sdk v1.1.0
github.com/qdrant/go-client v1.16.2
)

require (
github.com/google/jsonschema-go v0.3.0 // indirect
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/text v0.31.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba // indirect
google.golang.org/grpc v1.76.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
)
48 changes: 48 additions & 0 deletions mcp/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/modelcontextprotocol/go-sdk v1.1.0 h1:Qjayg53dnKC4UZ+792W21e4BpwEZBzwgRW6LrjLWSwA=
github.com/modelcontextprotocol/go-sdk v1.1.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10=
github.com/qdrant/go-client v1.16.2 h1:UUMJJfvXTByhwhH1DwWdbkhZ2cTdvSqVkXSIfBrVWSg=
github.com/qdrant/go-client v1.16.2/go.mod h1:I+EL3h4HRoRTeHtbfOd/4kDXwCukZfkd41j/9wryGkw=
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
Loading
Loading