Files
v-hono/examples/auth_example.v
T

167 lines
6.3 KiB
V
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.
module main
import hono
import net.http
import x.json2
// 响应结构体
struct ErrorResponse {
error string
}
struct ProtectedUserResponse {
message string
user_id string
username string
email string
role string
}
struct ProtectedAdminResponse {
message string
user_id string
username string
email string
role string
}
fn main() {
// 创建数据库管理器
db_manager := hono.new_database_manager('auth_system.db') or {
eprintln('Failed to create database manager: $err')
return
}
// 创建认证管理器
mut auth_manager := hono.new_auth_manager(db_manager)
// 初始化认证相关表
auth_manager.init_tables() or {
eprintln('Failed to initialize auth tables: $err')
return
}
// 创建 Hono 应用
mut app := hono.Hono{}
// 注册认证路由
hono.register_auth_routes(mut app, mut auth_manager)
// 添加一些示例菜单项
create_sample_menus(mut auth_manager)
// 添加一些示例用户
create_sample_users(mut auth_manager)
// 添加一些受保护的路由示例
app.get('/api/protected/user', fn [auth_manager] (mut c hono.Context) http.Response {
token := c.req.header.get_custom('Authorization') or { '' }
user := auth_manager.verify_token(token) or {
c.status(401)
return c.json(json2.encode[ErrorResponse](ErrorResponse{
error: 'User not found'
}))
}
return c.json(json2.encode[ProtectedUserResponse](ProtectedUserResponse{
message: 'This is a protected user route'
user_id: user.id.str()
username: user.username
email: user.email
role: user.role.str()
}))
})
app.get('/api/protected/admin', fn [auth_manager] (mut c hono.Context) http.Response {
token := c.req.header.get_custom('Authorization') or { '' }
user := auth_manager.verify_token(token) or {
c.status(401)
return c.json(json2.encode[ErrorResponse](ErrorResponse{
error: 'User not found'
}))
}
if !auth_manager.check_permission(user, 'manage') {
c.status(403)
return c.json(json2.encode[ErrorResponse](ErrorResponse{
error: 'Admin access required'
}))
}
return c.json(json2.encode[ProtectedAdminResponse](ProtectedAdminResponse{
message: 'This is a protected admin route'
user_id: user.id.str()
username: user.username
email: user.email
role: user.role.str()
}))
})
// 添加静态文件服务
app.get('/', fn (mut c hono.Context) http.Response {
return c.file('public/auth.html')
})
println('🚀 用户角色菜单管理系统已启动')
println('📱 访问地址: http://localhost:3000')
println('')
println('📋 示例用户:')
println(' 用户名: admin, 密码: admin123, 角色: admin')
println(' 用户名: manager, 密码: manager123, 角色: manager')
println(' 用户名: user, 密码: user123, 角色: user')
println(' 用户名: guest, 密码: guest123, 角色: guest')
println('')
// 启动服务器
app.listen(':3000')
}
// 创建示例菜单
fn create_sample_menus(mut auth_manager hono.AuthManager) {
// 创建根菜单
auth_manager.create_menu_item('仪表板', '/dashboard', '📊', 0, 1, ['read']) or { println('仪表板插入失败') }
auth_manager.create_menu_item('用户管理', '/users', '👥', 0, 2, ['read', 'write', 'manage']) or { println('用户管理插入失败') }
auth_manager.create_menu_item('系统设置', '/settings', '⚙️', 0, 3, ['manage']) or { println('系统设置插入失败') }
auth_manager.create_menu_item('文件管理', '/files', '📁', 0, 4, ['read', 'write']) or { println('文件管理插入失败') }
// 获取用户管理菜单ID(动态获取)
user_menu_id := auth_manager.get_menu_id_by_path('/users')
// 创建子菜单
auth_manager.create_menu_item('用户列表', '/users/list', '📋', user_menu_id, 1, ['read']) or { println('用户列表插入失败') }
auth_manager.create_menu_item('添加用户', '/users/add', '➕', user_menu_id, 2, ['write']) or { println('添加用户插入失败') }
auth_manager.create_menu_item('编辑用户', '/users/edit', '✏️', user_menu_id, 3, ['write']) or { println('编辑用户插入失败') }
auth_manager.create_menu_item('删除用户', '/users/delete', '🗑️', user_menu_id, 4, ['manage']) or { println('删除用户插入失败') }
// 更多测试菜单
auth_manager.create_menu_item('报表中心', '/reports', '📈', 0, 5, ['read', 'write']) or { println('报表中心插入失败') }
reports_menu_id := auth_manager.get_menu_id_by_path('/reports')
auth_manager.create_menu_item('销售报表', '/reports/sales', '💹', reports_menu_id, 1, ['read']) or { println('销售报表插入失败') }
auth_manager.create_menu_item('财务报表', '/reports/finance', '💰', reports_menu_id, 2, ['read']) or { println('财务报表插入失败') }
auth_manager.create_menu_item('消息中心', '/messages', '📨', 0, 6, ['read']) or { println('消息中心插入失败') }
auth_manager.create_menu_item('个人中心', '/profile', '👤', 0, 7, ['read', 'write']) or { println('个人中心插入失败') }
auth_manager.create_menu_item('测试菜单A', '/test/a', '🅰️', 0, 8, ['read']) or { println('测试菜单A插入失败') }
auth_manager.create_menu_item('测试菜单B', '/test/b', '🅱️', 0, 9, ['read']) or { println('测试菜单B插入失败') }
auth_manager.create_menu_item('测试菜单C', '/test/c', '🆑', 0, 10, ['read']) or { println('测试菜单C插入失败') }
test_a_id := auth_manager.get_menu_id_by_path('/test/a')
auth_manager.create_menu_item('A-子菜单1', '/test/a/1', '1️⃣', test_a_id, 1, ['read']) or { println('A-子菜单1插入失败') }
auth_manager.create_menu_item('A-子菜单2', '/test/a/2', '2️⃣', test_a_id, 2, ['read']) or { println('A-子菜单2插入失败') }
println('✅ 示例菜单已创建')
println('✅ 更多测试菜单已创建')
}
// 创建示例用户
fn create_sample_users(mut auth_manager hono.AuthManager) {
// 创建管理员用户
auth_manager.create_user('admin', 'admin@example.com', 'admin123', hono.UserRole.admin) or { return }
// 创建经理用户
auth_manager.create_user('manager', 'manager@example.com', 'manager123', hono.UserRole.manager) or { return }
// 创建普通用户
auth_manager.create_user('user', 'user@example.com', 'user123', hono.UserRole.user) or { return }
// 创建访客用户
auth_manager.create_user('guest', 'guest@example.com', 'guest123', hono.UserRole.guest) or { return }
println('✅ 示例用户已创建')
}