创建文件夹、文件
请按照下图结构创建文件夹、文件,以此来划分各部分功能

添加、整理代码
main.zig
| const std = @import("std"); |
| const route = @import("./router/route.zig"); |
| |
| pub fn main() !void { |
| // 初始化路由并启动服务 |
| try route.initRoute(); |
| } |
| |
database/db.zig
| const sqlite = @import("sqlite"); |
| |
| pub fn OpenDb() !sqlite.Db { |
| const db = try sqlite.Db.init(.{ |
| .mode = sqlite.Db.Mode{ .File = "db_zigblog.db" }, |
| .open_flags = .{}, |
| .threading_mode = .MultiThread, |
| }); |
| |
| return db; |
| } |
| |
model/user.zig
| pub const User = struct { |
| id: u32, |
| username: []const u8, |
| password: []const u8, |
| nickname: []const u8, |
| }; |
| |
model/article.zig
| pub const Article = struct { |
| id: u32, |
| title: []const u8, |
| description: []const u8, |
| content: []const u8, |
| istop: u32, |
| created_at: []const u8, |
| updated_at: []const u8, |
| }; |
| |
model/cate.zig
| pub const Category = struct { |
| id: u32, |
| name: []const u8, |
| }; |
| |
router/route.zig
| const std = @import("std"); |
| const httpz = @import("httpz"); |
| const userController = @import("../controller/user_controller.zig"); |
| |
| /// 初始化路由 |
| pub fn initRoute() !void { |
| var gpa = std.heap.GeneralPurposeAllocator(.{}){}; |
| const allocator = gpa.allocator(); |
| |
| var server = try httpz.Server().init(allocator, .{ |
| .port = 5588, |
| // 跨域设置 |
| .cors = .{ |
| .origin = "*", |
| .methods = "GET, POST, PUT, DELETE, OPTIONS, PATCH", |
| .headers = "*", |
| }, |
| }); |
| defer server.deinit(); |
| |
| // 创建路由 |
| var router = server.router(); |
| |
| // 注册路由 |
| // 测试api,获取用户信息 |
| router.get("/api/user/:id", &userController.getUser); |
| // 测试api,测试连接sqlite数据库 |
| router.get("/api/sqlite/user", &userController.getSqliteOneUser); |
| |
| std.log.info("Server listening on http://localhost:5588", .{}); |
| |
| try server.listen(); |
| } |
| |
controller/user_controller.zig
| const std = @import("std"); |
| const httpz = @import("httpz"); |
| const user_server = @import("../server/user_server.zig"); |
| |
| pub fn getUser(req: *httpz.Request, res: *httpz.Response) !void { |
| res.status = 200; |
| try res.json(.{ .id = req.param("id").?, .name = "Teg" }, .{}); |
| } |
| |
| // 测试api,测试连接sqlite数据库 |
| pub fn getSqliteOneUser(req: *httpz.Request, res: *httpz.Response) !void { |
| _ = req; |
| res.status = 200; |
| |
| const user_op = try user_server.getUserById(1); |
| |
| if (user_op) |user| { |
| try res.json(.{ .code = 200, .msg = "ok", .data = user }, .{}); |
| } else { |
| try res.json(.{ .code = 404, .msg = "not found" }, .{}); |
| } |
| } |
| |
server/user_server.zig
| const std = @import("std"); |
| const database = @import("../database/db.zig"); |
| const UserModel = @import("../model/user.zig"); |
| |
| /// 通过id获取用户信息 |
| pub fn getUserById(user_id: u32) !?UserModel.User { |
| var db = try database.OpenDb(); |
| defer db.deinit(); |
| |
| const query = |
| \\SELECT id, username, nickname FROM user WHERE id = ? |
| ; |
| |
| var stmt = try db.prepare(query); |
| defer stmt.deinit(); |
| |
| var gpa = std.heap.GeneralPurposeAllocator(.{}){}; |
| const allocator = gpa.allocator(); |
| |
| const row = try stmt.oneAlloc(struct { |
| id: u32, |
| username: []const u8, |
| nickname: []const u8, |
| }, allocator, .{}, .{ |
| .id = user_id, |
| }); |
| |
| if (row) |r| { |
| return UserModel.User{ |
| .id = r.id, |
| .username = r.username, |
| .password = undefined, |
| .nickname = r.nickname, |
| }; |
| } else { |
| return null; |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?