使用zig语言制作简单博客网站(四)项目文件整理

88 阅读1分钟

创建文件夹、文件

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

添加、整理代码

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;
    }
}