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

创建文件夹、文件

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

添加、整理代码

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;
}
}
posted @   ※听雨※  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示