Files

371 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Resume Platform · 智能简历平台
[![Go Version](https://img.shields.io/badge/Go-1.25+-00ADD8?style=flat-square&logo=go)](https://go.dev/)
[![Gin](https://img.shields.io/badge/Gin-1.9.1-00ADD8?style=flat-square)](https://gin-gonic.com/)
[![SQLite](https://img.shields.io/badge/SQLite-3.x-003B57?style=flat-square&logo=sqlite)](https://www.sqlite.org/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](#贡献指南)
> 基于 Go + Gin + SQLite 的现代化开源简历平台,内置 AI 面试助手、多模板支持、多人简历管理,让你的个人主页脱颖而出。
---
## ✨ 功能特性
### 📄 简历管理
- **多人简历支持** — 每个人独立访问路由(如 `/zhangsan``/lisi`),支持人员绑定与解绑
- **多模板主题** — 内置 7 种精美模板(modern / classic / fresh / minimalist / professional / tech / project
- **实时编辑** — 所见即所得的编辑体验,自动保存防止丢失
- **访问密码** — 支持为简历设置独立访问密码,保护隐私
- **数据脱敏** — 公开展示时自动脱敏手机号、邮箱等敏感信息
### 🤖 AI 智能面试
- **智能出题** — 基于简历内容或关键词自动生成面试题,支持选择题、填空题、简答题、算法题
- **多 AI 提供商** — 接入 DeepSeek / 豆包 / 讯飞星火 / 通义千问,自由切换
- **关键词驱动** — 智能提取简历技能作为关键词,支持别名扩展,每次生成随机不重复
- **答题记录** — 完整记录每次答题情况,支持查看历史、重练错题
- **收藏 & 错题本** — 一键收藏好题,错题自动入库,针对性复习
### 🎨 作品集展示
- **独立作品集页** — 每个用户拥有专属作品集展示页面
- **项目关联** — 支持从简历项目中导入,也可独立创建
- **分类筛选** — 按技术栈、类型快速筛选项目
- **首页精选** — 可设置首页展示的精选项目
### 🛡️ 安全保障
- **后台隐藏路径** — 自定义管理后台 URL,降低被探测风险
- **登录验证码** — 图形验证码防止机器人暴力破解
- **登录限流** — 基于 IP 的登录次数限制,超出自动锁定
- **AES 加密** — 数据库支持 AES-GCM 加密存储,敏感数据更安全
- **PBKDF2 密钥派生** — 使用 PBKDF2-SHA256 派生加密密钥
### 📊 管理后台
- **仪表盘** — 数据总览,快速了解平台运行状态
- **用户管理** — 完整的用户 CRUD,支持状态管理
- **简历管理** — 统一管理所有简历,支持绑定/解绑人员
- **答题管理** — 查看用户答题记录、学习进度
- **菜单管理** — 自定义后台导航菜单
- **系统设置** — 站点名称、Logo、SEO 等配置可视化管理
- **全局搜索** — 一键搜索用户、简历、作品集
---
## 🏗️ 技术栈
| 类别 | 技术 | 版本 |
|------|------|------|
| 语言 | Go | 1.25+ |
| Web 框架 | Gin | v1.9.1 |
| 数据库 | SQLite (modernc.org/sqlite) | v1.26.0 |
| AI Agent | CloudWeGo Eino | v0.9.12 |
| 配置管理 | Viper | v1.18.2 |
| 验证码 | base64Captcha | v1.3.2 |
| 前端 | HTML Template + Tailwind CSS + Font Awesome | — |
| 部署 | Docker / Docker Compose | — |
---
## 📁 项目结构
```
resume-platform/
├── cmd/
│ ├── server/ # 主服务入口
│ │ └── main.go
│ └── checkdb/ # 数据库检查工具
│ └── main.go
├── config/
│ └── config.yaml # 应用配置文件
├── internal/
│ ├── agent/ # AI Agent 层(Eino
│ │ ├── config.go
│ │ └── tools.go # 题目生成、答案解析等工具
│ ├── ai/ # AI 提供商适配层
│ │ ├── provider.go # 统一接口定义
│ │ ├── deepseek.go
│ │ ├── doubao.go
│ │ ├── spark.go
│ │ └── tongyi.go
│ ├── handler/ # HTTP 处理器
│ │ ├── admin.go # 管理后台
│ │ ├── ai.go # AI 相关接口
│ │ ├── chat.go # AI 对话接口
│ │ ├── document.go # 文档解析接口
│ │ ├── response.go # 统一响应格式
│ │ └── resume.go # 简历/作品集/答题 API
│ ├── model/ # 数据模型
│ │ ├── resume.go # 简历、用户、题目、作品集等
│ │ └── document.go
│ ├── parser/ # 简历解析
│ │ └── parser.go
│ ├── repository/ # 数据访问层
│ │ ├── interface.go # 仓库接口定义
│ │ └── sqlite.go # SQLite 实现
│ ├── router/ # 路由配置
│ │ ├── router.go # 路由总入口
│ │ ├── admin.go # 管理后台路由
│ │ ├── api.go # REST API 路由
│ │ └── frontend.go # 前端页面路由
│ ├── security/ # 安全模块
│ │ ├── captcha.go # 验证码
│ │ └── rate_limiter.go # 登录限流
│ └── service/ # 业务逻辑层
│ ├── ai_service.go # AI 服务
│ ├── chat.go # 对话服务
│ ├── document.go # 文档服务
│ ├── resume.go # 简历服务
│ └── vector.go # 向量服务
├── pkg/
│ └── config/ # 公共配置包
│ └── config.go
├── static/ # 静态资源
│ ├── images/
│ └── js/
├── templates/ # HTML 模板
│ ├── admin/ # 管理后台模板
│ └── web/ # 前端展示模板
├── data/ # 数据库文件(运行时生成)
├── logs/ # 日志文件(运行时生成)
├── Dockerfile
├── docker-compose.yml
├── go.mod
└── go.sum
```
---
## 🚀 快速开始
### 环境要求
- **Go 1.25+**(推荐使用最新稳定版)
-**Docker** / **Docker Compose**
### 本地运行
```bash
# 1. 克隆项目
git clone https://github.com/yourusername/resume-platform.git
cd resume-platform
# 2. 安装依赖
go mod download
# 3. 运行服务
go run cmd/server/main.go
```
服务启动后:
| 地址 | 说明 |
|------|------|
| http://localhost:8090 | 产品首页 |
| http://localhost:8090/default | 默认简历示例 |
| http://localhost:8090/my-secret-admin-123 | 管理后台(默认路径) |
> **默认账号**`admin` / `admin123456`
>
> ⚠️ 生产环境请务必修改默认密码和后台路径!
### Docker 部署
#### 使用 Docker Compose(推荐)
```bash
docker-compose up -d
```
#### 手动构建
```bash
docker build -t resume-platform .
docker run -d \
-p 8090:8090 \
-v $(pwd)/data:/app/data \
-v $(pwd)/logs:/app/logs \
--name resume-platform \
resume-platform
```
---
## ⚙️ 配置说明
配置文件位于 `config/config.yaml`,所有配置项均支持通过环境变量覆盖。
```yaml
server:
host: "0.0.0.0" # 监听地址
port: 8090 # 监听端口
mode: "release" # Gin 模式:debug / release
database:
type: "sqlite" # 数据库类型(目前仅支持 SQLite)
path: "./data/resume.db" # 数据库文件路径
password: "resume@2024" # 数据库加密密码
auth:
enabled: true # 是否启用后台认证
username: "admin" # 管理员用户名
password: "admin123456" # 管理员密码
admin_path: "/my-secret-admin-123" # 后台路径(建议修改)
max_login_attempts: 5 # 最大登录尝试次数
lockout_duration: 15 # 锁定时长(分钟)
template:
default: "modern" # 默认简历模板
log:
level: "info" # 日志级别
output: "./logs/app.log" # 日志输出路径
ai:
provider: "spark" # AI 提供商:spark / tongyi / doubao / deepseek
enabled: true # 是否启用 AI 功能
spark: # 讯飞星火配置
api_password: ""
base_url: ""
model: "lite"
max_tokens: 1024
timeout: 30
# 其他 AI 提供商配置...
```
---
## 🔌 API 概览
### 简历接口
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/resume/:id` | 获取单份简历 |
| `GET` | `/api/resume/by-route/:route` | 按路由获取简历 |
| `POST` | `/api/resume` | 创建简历 |
| `PUT` | `/api/resume/:id` | 更新简历 |
| `DELETE` | `/api/resume/:id` | 删除简历 |
| `GET` | `/api/user/resumes` | 获取指定用户的简历列表 |
### AI 答题接口
| 方法 | 路径 | 说明 |
|------|------|------|
| `POST` | `/api/ai/agent/generate-questions` | 生成面试题 |
| `POST` | `/api/ai/agent/submit-answers` | 提交答案并评分 |
| `POST` | `/api/ai/agent/evaluate-answers` | 评估答案 |
### 收藏 & 错题
| 方法 | 路径 | 说明 |
|------|------|------|
| `POST` | `/api/favorite` | 添加收藏/错题 |
| `GET` | `/api/favorite` | 获取收藏/错题列表 |
| `DELETE` | `/api/favorite/:id` | 删除收藏/错题 |
| `PUT` | `/api/favorite/:id/toggle` | 切换收藏状态 |
### 作品集接口
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/portfolio` | 获取作品集列表 |
| `POST` | `/api/portfolio` | 创建作品集项目 |
| `GET` | `/api/portfolio/:id` | 获取单个项目 |
| `PUT` | `/api/portfolio/:id` | 更新项目 |
| `DELETE` | `/api/portfolio/:id` | 删除项目 |
### 管理后台
所有管理接口前缀为 `{admin_path}/`(默认 `/my-secret-admin-123/`)。
---
## 🧩 模板系统
内置 7 种精美模板,支持随时切换:
| 模板 | 风格 | 适用场景 |
|------|------|----------|
| `modern` | 现代简约 | 通用型,推荐首选 |
| `classic` | 经典商务 | 传统行业、资深岗位 |
| `fresh` | 清新活力 | 应届生、设计岗 |
| `minimalist` | 极简主义 | 追求简洁表达 |
| `professional` | 专业职业 | 管理岗、专业岗 |
| `tech` | 技术导向 | 程序员、工程师 |
| `project` | 项目展示 | 突出项目经验 |
> 模板文件位于 `templates/web/`,可基于现有模板自定义新主题。
---
## 🛠️ 开发指南
### 添加新模板
1.`templates/web/` 目录下创建 `your-template.html`
2. 继承 `base.html` 的结构,使用 Go 模板语法访问 `.Resume` 数据
3.`resume.Template` 字段设置模板名称即可
### 添加新的 AI 提供商
1.`internal/ai/` 下创建 `yourprovider.go`
2. 实现 `AIProvider` 接口
3.`provider.go``NewProvider` 工厂中注册
### 数据库迁移
项目使用 `CREATE TABLE IF NOT EXISTS` + `migrateSchema` 机制自动处理表结构变更。新增列时在 `migrateSchema` 函数中添加对应 `ALTER TABLE ADD COLUMN` 语句即可,程序启动时自动执行。
### 代码规范
```bash
# 格式化代码
gofmt -w .
# 静态检查
go vet ./...
# 构建检查
go build ./...
```
---
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request
### 贡献流程
1. **Fork** 本仓库
2. 创建特性分支:`git checkout -b feature/AmazingFeature`
3. 提交更改:`git commit -m 'Add some AmazingFeature'`
4. 推送到分支:`git push origin feature/AmazingFeature`
5. 打开 **Pull Request**
### 提交规范
- 使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范
- 示例:`feat: add dark mode support``fix: correct user binding display`
---
## 📜 开源协议
本项目基于 **MIT License** 开源,详见 [LICENSE](LICENSE) 文件。
---
## ⭐ 支持项目
如果这个项目对你有帮助,欢迎:
- 点个 Star ⭐️ 让更多人看到
- 分享给身边需要的朋友
- 提交 Issue / PR 一起完善
---
<div align="center">
<p>Made with ❤️ by Resume Platform Team</p>
</div>