创建文件夹、文件
请按照下图结构创建文件夹、文件,以此来划分各部分功能
添加、整理代码
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;
}
}