mit einem Klick
orm-gen
重新生成 Drogon ORM 模型类(基于当前数据库表结构)
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Menü
重新生成 Drogon ORM 模型类(基于当前数据库表结构)
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Basierend auf der SOC-Berufsklassifikation
通过微信机器人发送通知消息(文本、图片、文件、视频)
构建和测试C++ OAuth2后端,包含正确的依赖管理
重置测试数据库(清空并重新初始化所有表结构和数据)
执行OAuth2系统的完整端到端(E2E)测试,验证用户登录、授权码流程、token交换、RBAC权限控制和受保护API访问的完整功能。当用户需要在代码变更后验证整个OAuth2认证流程、测试用户登录和权限管理、验证修复后的安全功能、或在生产部署前进行完整的功能验证时使用此技能。
在Docker Compose环境中执行OAuth2系统的完整集成测试和健康检查。当用户需要在代码变更后验证功能、运行端到端测试、检查Docker环境健康状态、或需要验证整个OAuth2系统(前端+后端+数据库+缓存)的集成时使用此技能。确保在Docker环境中测试所有组件的集成,包括健康检查、OAuth2流程、API端点、数据库连接、Redis缓存和前后端通信。
管理 OAuth2 项目的 Docker 容器和服务,包括启动、停止、清理和状态检查
| name | orm-gen |
| description | 重新生成 Drogon ORM 模型类(基于当前数据库表结构) |
| disable-model-invocation | true |
重新生成 Drogon ORM 模型类以匹配最新的数据库表结构。
通过用户调用:/orm-gen
# 1. 检查 PostgreSQL 服务是否运行
pg_isready -h localhost -p 5432 || echo "❌ PostgreSQL not running"
# 2. 检查数据库是否存在
export PGPASSWORD='123456'
psql -h localhost -U oauth2_user -d oauth2_db -c "SELECT 1;" || echo "❌ Database oauth2_db not found"
# 3. 检查 drogon_ctl 工具是否安装
which drogon_ctl || echo "❌ drogon_ctl not found"
drogon_ctl version || echo "❌ drogon_ctl not working"
# 4. 检查 models 目录是否存在
ls OAuth2Server/model.json || echo "❌ model.json not found"
# 查看当前数据库中的所有表
export PGPASSWORD='123456'
psql -h localhost -U oauth2_user -d oauth2_db -c "\dt"
# 预期输出应包含:
# - oauth2_clients
# - oauth2_codes
# - oauth2_access_tokens
# - oauth2_refresh_tokens
# - users
# - roles
# - permissions
# - user_roles
# - role_permissions
# 查看当前 ORM 生成配置
cat OAuth2Server/model.json
标准配置:
{
"rdbms": "postgresql",
"host": "127.0.0.1",
"port": 5432,
"dbname": "oauth2_db",
"user": "test",
"passwd": "123456",
"tables": [
"users",
"roles",
"permissions",
"user_roles",
"role_permissions",
"oauth2_clients",
"oauth2_codes",
"oauth2_access_tokens",
"oauth2_refresh_tokens"
]
}
# Windows PowerShell
cd OAuth2Server
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupDir = "models_backup_$timestamp"
New-Item -ItemType Directory -Path $backupDir | Out-Null
# 备份模型文件(如果存在)
if (Test-Path "model.json") {
Copy-Item model.json $backupDir\
}
if (Test-Path "models") {
Copy-Item models\*.h, models\*.cc $backupDir\ 2>$null
}
Write-Host "✅ Models backed up to $backupDir"
# Linux/macOS
cd OAuth2Server
timestamp=$(date +%Y%m%d_%H%M%S)
backup_dir="models_backup_$timestamp"
mkdir -p $backup_dir
# 备份模型文件
cp model.json $backup_dir/ 2>/dev/null || true
cp models/*.h models/*.cc $backup_dir/ 2>/dev/null || true
echo "✅ Models backed up to $backup_dir"
# Windows PowerShell
# 检查 OAuth2Server 目录结构
cd d:\work\development\Repos\backend\drogon-plugin\authforge\OAuth2Server
# 创建 models 目录(如果不存在)
if (!(Test-Path "models")) {
New-Item -ItemType Directory -Path "models" | Out-Null
Write-Host "✅ Created models directory"
}
# 进入 models 目录
cd models
# Linux/macOS
cd /path/to/authforge/OAuth2Server
# 创建 models 目录(如果不存在)
mkdir -p models
echo "✅ Created models directory"
# 进入 models 目录
cd models
# Windows PowerShell
Get-ChildItem -Filter "*.h" | Where-Object { $_.Name -ne "orm_compat.h" } | Remove-Item
Get-ChildItem -Filter "*.cc" | Remove-Item
Write-Host "✅ Old model files removed"
# Linux/macOS
rm -f *.h *.cc
echo "✅ Old model files removed"
# Windows PowerShell - 使用专项脚本
cd d:\work\development\Repos\backend\drogon-plugin\authforge
scripts/backend/generate_models.bat -y
# 此脚本会自动完成:
# 1. 检查数据库连接
# 2. 验证 model.json 配置
# 3. 备份现有模型文件
# 4. 执行 drogon_ctl 生成
# 5. 验证生成结果
# 6. 返回到项目根目录
# 确保在正确的目录
cd OAuth2Server/models
# 执行 drogon_ctl 生成命令
drogon_ctl create model ../
预期输出:
Generating models for tables:
- users
- roles
- permissions
- user_roles
- role_permissions
- oauth2_clients
- oauth2_codes
- oauth2_access_tokens
- oauth2_refresh_tokens
Models generated successfully!
# Windows PowerShell
Write-Host "`n=== Generated Files ==="
Get-ChildItem *.h, *.cc | Select-Object Name, LastWriteTime | Format-Table -AutoSize
# 验证关键文件
$requiredFiles = @(
"Users.h", "Users.cc",
"Roles.h", "Roles.cc",
"Permissions.h", "Permissions.cc",
"UserRoles.h", "UserRoles.cc",
"RolePermissions.h", "RolePermissions.cc",
"Oauth2Clients.h", "Oauth2Clients.cc",
"Oauth2Codes.h", "Oauth2Codes.cc",
"Oauth2AccessTokens.h", "Oauth2AccessTokens.cc",
"Oauth2RefreshTokens.h", "Oauth2RefreshTokens.cc"
)
$missingFiles = @()
foreach ($file in $requiredFiles) {
if (!(Test-Path $file)) {
$missingFiles += $file
}
}
if ($missingFiles.Count -gt 0) {
Write-Host "❌ Missing files: $($missingFiles -join ', ')" -ForegroundColor Red
exit 1
} else {
Write-Host "✅ All required model files generated" -ForegroundColor Green
}
# Linux/macOS
echo "=== Generated Files ==="
ls -lh *.h *.cc | awk '{print $9, $6, $7, $8}'
# 验证关键文件
required_files=(
"Users.h" "Users.cc"
"Roles.h" "Roles.cc"
"Permissions.h" "Permissions.cc"
"UserRoles.h" "UserRoles.cc"
"RolePermissions.h" "RolePermissions.cc"
"Oauth2Clients.h" "Oauth2Clients.cc"
"Oauth2Codes.h" "Oauth2Codes.cc"
"Oauth2AccessTokens.h" "Oauth2AccessTokens.cc"
"Oauth2RefreshTokens.h" "Oauth2RefreshTokens.cc"
)
missing_files=()
for file in "${required_files[@]}"; do
if [ ! -f "$file" ]; then
missing_files+=("$file")
fi
done
if [ ${#missing_files[@]} -gt 0 ]; then
echo "❌ Missing files: ${missing_files[@]}"
exit 1
else
echo "✅ All required model files generated"
fi
# 随机抽查一个文件,确认生成正确
head -20 Oauth2Clients.h
# 应该包含:
# - 自动生成的注释:"DO NOT EDIT. This file is generated by drogon_ctl"
# - 类定义继承 Drogon ORM 基类
# - Getter/Setter 方法
# Windows PowerShell - 新的构建路径
cd build/OAuth2Server
cmake --build . --parallel --config Release
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ Build successful" -ForegroundColor Green
} else {
Write-Host "❌ Build failed" -ForegroundColor Red
exit 1
}
# Linux/macOS
cd build/OAuth2Server
cmake --build . --parallel
if [ $? -eq 0 ]; then
echo "✅ Build successful"
else
echo "❌ Build failed"
exit 1
fi
# 运行测试确保 ORM 模型工作正常
cd build
ctest --output-on-failure -C Release
| 配置项 | 值 | 说明 |
|---|---|---|
| 主机 | 127.0.0.1 / localhost | 本地连接 |
| 端口 | 5432 | PostgreSQL 默认端口 |
| 数据库 | oauth2_db | OAuth2 测试数据库 |
| 用户名 | test | 测试用户 |
| 密码 | 123456 | 测试密码 |
| 表名 | 头文件 | 源文件 | 说明 |
|---|---|---|---|
| users | Users.h | Users.cc | 用户账号表 |
| roles | Roles.h | Roles.cc | 角色表 |
| permissions | Permissions.h | Permissions.cc | 权限表 |
| user_roles | UserRoles.h | UserRoles.cc | 用户-角色关联表 |
| role_permissions | RolePermissions.h | RolePermissions.cc | 角色-权限关联表 |
| oauth2_clients | Oauth2Clients.h | Oauth2Clients.cc | OAuth2 客户端表 |
| oauth2_codes | Oauth2Codes.h | Oauth2Codes.cc | OAuth2 授权码表 |
| oauth2_access_tokens | Oauth2AccessTokens.h | Oauth2AccessTokens.cc | OAuth2 访问令牌表 |
| oauth2_refresh_tokens | Oauth2RefreshTokens.h | Oauth2RefreshTokens.cc | OAuth2 刷新令牌表 |
症状: drogon_ctl: command not found
解决方案:
# 检查 Drogon 安装
which drogon_ctl
# 如果未找到,重新安装 Drogon
# 使用 Conan
conan install drogon/[>=1.8.4]
# 或使用系统包管理器
# Ubuntu/Debian
sudo apt-get install drogon
# macOS
brew install drogon
症状: failed to connect to database 或 connection refused
解决方案:
# 检查 PostgreSQL 服务
pg_isready -h localhost -p 5432
# 启动 PostgreSQL
# Windows
Start-Service postgresql*
# Linux
sudo systemctl start postgresql
# macOS
brew services start postgresql
# 验证数据库凭据
export PGPASSWORD='123456'
psql -h localhost -U oauth2_user -d oauth2_db -c "SELECT 1;"
症状: ERROR: relation "xxx" does not exist
解决方案:
# 先重置数据库
/db-reset
# 然后验证表是否存在
export PGPASSWORD='123456'
psql -h localhost -U oauth2_user -d oauth2_db -c "\dt"
症状: 部分模型文件缺失或为空
解决方案:
# 检查 model.json 配置
cat OAuth2Server/model.json
# 确保 tables 数组包含所有需要的表
# 手动添加缺失的表名
# 重新执行生成
cd OAuth2Server
drogon_ctl create model .
症状: 生成后编译失败,提示语法错误
解决方案:
# 检查 Drogon 版本
drogon_ctl version
# 确保 Drogon 版本 >= 1.8.0
# 如果版本过旧,更新 Drogon
# 检查生成的文件内容
head -50 Oauth2Clients.h
# 确认文件开头有正确的注释:
# "DO NOT EDIT. This file is generated by drogon_ctl"
症状: 运行时错误,提示字段类型与数据库不符
解决方案:
# 查看数据库表结构
export PGPASSWORD='123456'
psql -h localhost -U oauth2_user -d oauth2_db -c "\d oauth2_clients"
# 如果表结构已更改,先删除旧表
# 然后重新执行 SQL 脚本
/db-reset
# 最后重新生成模型
/orm-gen
# 1. 修改 migration SQL 脚本
vim OAuth2Server/sql/migrations/V002__oauth2_core.sql
# 2. 重置数据库
/db-reset
# 3. 重新生成 ORM 模型
/orm-gen
# 4. 重新编译项目
/build-and-test
# 5. 运行测试验证
cd build/OAuth2Server && ctest --output-on-failure
# 每次生成前自动备份
timestamp=$(date +%Y%m%d_%H%M%S)
backup_dir="models_backup_$timestamp"
mkdir -p $backup_dir
cp OAuth2Server/*.h OAuth2Server/*.cc $backup_dir/
# 保留最近 5 次备份
ls -td models_backup_* | tail -n +6 | xargs rm -rf
# .github/workflows/ci.yml
- name: Reset Database
run: /db-reset
- name: Generate ORM Models
run: /orm-gen
- name: Build Project
run: /build-and-test
- name: Run Tests
run: ctest --output-on-failure
# .gitignore 配置
# 自动生成的模型文件可以提交到版本控制
OAuth2Server/models/*.h
OAuth2Server/models/*.cc
# 但备份文件应该忽略
models_backup_*/
# model.json 应该提交
OAuth2Server/model.json
生成模型后,需要检查:
⚠️ 重要提示:
/db-reset - 重置数据库(表结构变更前)/build-and-test - 生成后编译和测试/e2e-test - 端到端测试验证 ORM 模型✅ 成功执行后应看到:
✅ Old model files removed
Models generated successfully!
✅ All required model files generated
✅ Build successful
✅ Tests passed
且 ls 应显示所有 9 张表对应的模型文件(18 个文件:9 个 .h + 9 个 .cc)
每个生成的模型类包含:
#include "models/Oauth2Clients.h"
using namespace drogon::orm;
using namespace drogon_model::oauth2_db;
// 查询客户端
Mapper<Oauth2Clients> mapper(dbClient);
mapper.findOne(
Criteria(Oauth2Clients::Cols::_client_id, CompareOperator::EQ, "test_client"),
[](const Oauth2Clients &client) {
std::string clientId = client.getValueOfClientId();
std::string secret = client.getValueOfClientSecret();
// 使用客户端数据...
},
[](const DrogonDbException &e) {
// 错误处理...
});