chore: initial commit

This commit is contained in:
2026-07-22 17:50:33 +08:00
parent 82936a8987
commit ee9f50b859
107 changed files with 8346 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
-- name: CreateCategory :exec
INSERT INTO categories(name, code)
VALUES ($1, $2);
-- name: ListCategories :many
SELECT *
FROM categories
ORDER BY id LIMIT $1
OFFSET $2;
-- name: CountCategories :one
SELECT COUNT(*)
FROM categories;
-- name: ListAllCategories :many
SELECT *
FROM categories;
-- name: GetCategoryById :one
SELECT *
FROM categories
WHERE id = $1;
-- name: UpdateCategory :execrows
UPDATE categories
SET name = coalesce(sqlc.narg('name'), name),
code = coalesce(sqlc.narg('code'), code)
WHERE id = sqlc.arg('id');
-- name: DeleteCategory :execrows
DELETE
FROM categories
WHERE id = $1;
-- name: CreatePostCategory :exec
INSERT INTO post_category(post_id, category_id)
VALUES ($1, $2);
-- name: DeletePostCategory :exec
DELETE
FROM post_category
WHERE post_id = $1;

View File

@@ -0,0 +1,13 @@
-- name: CreateFile :one
INSERT INTO files(file_name, file_path, original_name, folder_name, mime_type, file_size)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id,file_path,file_name;
-- name: GetFiles :many
SELECT *
FROM files
ORDER BY id LIMIT $1
OFFSET $2;
-- name: CountFiles :one
SELECT COUNT(*)
FROM files;

145
internal/db/query/post.sql Normal file
View File

@@ -0,0 +1,145 @@
-- name: CreatePost :one
INSERT INTO posts(title, cover_id, slug, content, summary, status, sort, published_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING id;
-- name: ListPosts :many
WITH paginated_posts AS (
-- 第一步:先精准查出当前页需要的文章 ID
SELECT id,
title,
cover_id,
slug,
summary,
status,
sort,
published_at,
created_at,
updated_at
FROM posts
ORDER BY sort DESC, published_at DESC, id DESC
LIMIT $1 OFFSET $2)
-- 第二步:用这极少量的记录去进行 JOIN
SELECT p.*,
f.file_path AS cover,
c.name AS category_name,
c.id AS category_id,
COALESCE(ps.view, 0) AS view
FROM paginated_posts p
LEFT JOIN files f ON f.id = p.cover_id
LEFT JOIN post_category pc ON pc.post_id = p.id
LEFT JOIN categories c ON c.id = pc.category_id
LEFT JOIN post_stats ps ON ps.post_id = p.id
ORDER BY p.sort DESC, p.published_at DESC, p.id DESC;
-- name: CountPosts :one
SELECT COUNT(*)
FROM posts;
-- name: GetPostById :one
SELECT p.*,
f.file_path AS cover,
c.name AS category_name,
c.id AS category_id
FROM posts p
LEFT JOIN files f ON f.id = p.cover_id
LEFT JOIN post_category pc ON pc.post_id = p.id
LEFT JOIN categories c ON c.id = pc.category_id
WHERE p.id = $1
LIMIT 1;
-- name: UpdatePost :execrows
UPDATE posts
SET title = coalesce(sqlc.narg('title'), title),
cover_id = coalesce(sqlc.narg('cover_id'), cover_id),
slug = coalesce(sqlc.narg('slug'), slug),
content = coalesce(sqlc.narg('content'), content),
summary = coalesce(sqlc.narg('summary'), summary),
status = coalesce(sqlc.narg('status'), status),
sort = coalesce(sqlc.narg('sort'), sort),
published_at = coalesce(sqlc.narg('published_at'), published_at)
WHERE id = sqlc.arg('id');
-- name: DeletePost :execrows
DELETE
FROM posts
WHERE id = $1;
-- web -------------------------------------------------------
-- name: GetPublicPostBySlug :one
SELECT p.*,
f.file_path AS cover,
COALESCE(ps.view, 0) AS view
FROM posts p
LEFT JOIN files f ON f.id = p.cover_id
LEFT JOIN post_stats ps ON ps.post_id = p.id
WHERE p.slug = $1
AND p.status = 1
AND p.published_at < NOW()
LIMIT 1;
-- name: ListPublishedPosts :many
WITH paginated_posts AS (
-- 第一步:先精准查出当前页需要的文章 ID
SELECT id,
title,
cover_id,
slug,
summary,
sort,
published_at
FROM posts
WHERE status = 1
AND published_at < NOW()
ORDER BY sort DESC, published_at DESC, id DESC
LIMIT $1 OFFSET $2)
SELECT p.*,
f.file_path AS cover,
c.name AS category_name,
c.id AS category_id,
COALESCE(ps.view, 0) AS view
FROM paginated_posts p
LEFT JOIN files f ON f.id = p.cover_id
LEFT JOIN post_category pc ON pc.post_id = p.id
LEFT JOIN categories c ON c.id = pc.category_id
LEFT JOIN post_stats ps ON ps.post_id = p.id
ORDER BY p.sort DESC, p.published_at DESC, p.id DESC;
-- name: CountPublishedPosts :one
SELECT COUNT(*)
FROM posts
WHERE status = 1
AND published_at < NOW();
-- name: ListArchives :many
SELECT
p.id,
p.slug,
p.title,
p.published_at,
c."name" AS category_name
FROM
posts p
LEFT JOIN post_category pc ON p.id = pc.post_id
LEFT JOIN categories c ON c.id = pc.category_id
WHERE
p.status = 1
AND p.published_at < NOW()
ORDER BY
p.published_at DESC, p.id DESC;
-- name: ListCategoryStats :many
SELECT
c.id,
c.name,
COUNT(p.id) AS post_count
FROM
categories c
LEFT JOIN post_category pc ON c.id = pc.category_id
LEFT JOIN posts p ON p.id = pc.post_id
AND p.status = 1
AND p.published_at < NOW()
GROUP BY
c.id,
c.name;

View File

@@ -0,0 +1,29 @@
-- name: IncrementPostStatsView :exec
WITH visitor AS (
INSERT INTO post_viewers (
post_id,
ip,
last_viewed_at
)
VALUES (
$1,
$2,
NOW()
)
ON CONFLICT (post_id, ip)
DO UPDATE
SET last_viewed_at = NOW()
WHERE post_viewers.last_viewed_at < NOW() - INTERVAL '30 minutes'
RETURNING post_id
)
INSERT INTO post_stats (
post_id,
view
)
SELECT
post_id,
1
FROM visitor
ON CONFLICT (post_id)
DO UPDATE
SET view = post_stats.view + 1;

View File

@@ -0,0 +1,58 @@
-- name: CreateSysApi :one
INSERT INTO sys_apis (name, group_name, method, path, sort)
VALUES ($1, $2, $3, $4, $5)
RETURNING id;
-- name: GetSysApis :many
SELECT *
FROM sys_apis
ORDER BY id
LIMIT $1 OFFSET $2;
-- name: CountSysApis :one
SELECT COUNT(*)
FROM sys_apis;
-- name: GetSysApiByID :one
SELECT *
FROM sys_apis
WHERE id = $1;
-- name: UpdateSysApi :execrows
UPDATE sys_apis
SET name = $2,
method = $3,
path = $4,
sort = $5,
group_name = $6
WHERE id = $1;
-- name: DeleteSysApi :execrows
DELETE
FROM sys_apis
WHERE id = $1;
-- name: CreateSysApiPermission :exec
INSERT INTO sys_api_permission (api_id, permission_id)
VALUES ($1, $2);
-- name: DeleteSysApiPermission :exec
DELETE
FROM sys_api_permission
WHERE api_id = $1;
-- name: DeleteSysPermissionBySysApiID :exec
DELETE
FROM sys_permissions
WHERE id IN (SELECT permission_id
FROM sys_api_permission
WHERE api_id = $1);
-- name: GetSysApiGroupNames :many
SELECT DISTINCT group_name
FROM sys_apis;
-- name: GetAllSysApis :many
SELECT *
FROM sys_apis
ORDER BY sort ASC;

View File

@@ -0,0 +1,71 @@
-- name: CreateSysMenu :one
INSERT INTO sys_menus (name, path, component, type, hidden, sort, status, parent_id, icon)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
RETURNING id;
-- name: ListSysMenus :many
SELECT m.*, p.code AS permission_code
FROM sys_menus m
LEFT JOIN sys_menu_permission mp ON m.id = mp.menu_id
LEFT JOIN sys_permissions p ON mp.permission_id = p.id
ORDER BY m.id
LIMIT $1 OFFSET $2;
-- name: CountSysMenus :one
SELECT COUNT(*)
FROM sys_menus;
-- name: GetAllSysMenus :many
SELECT m.*,
p.code AS permission_code
FROM sys_menus m
LEFT JOIN sys_menu_permission mp ON m.id = mp.menu_id
LEFT JOIN sys_permissions p ON p.id = mp.permission_id
ORDER BY m.sort ASC,
m.id ASC;
-- name: GetSysMenuByID :one
SELECT *
FROM sys_menus
WHERE id = $1;
-- name: UpdateSysMenu :execrows
UPDATE sys_menus
SET name = coalesce(sqlc.narg('name'), name),
path = coalesce(sqlc.narg('path'), path),
component = coalesce(sqlc.narg('component'), component),
type = coalesce(sqlc.narg('type'), type),
hidden = coalesce(sqlc.narg('hidden'), hidden),
sort = coalesce(sqlc.narg('sort'), sort),
status = coalesce(sqlc.narg('status'), status),
icon = coalesce(sqlc.narg('icon'), status),
parent_id = CASE WHEN @update_parent_id::boolean THEN @parent_id ELSE parent_id END
WHERE id = sqlc.arg('id');
-- name: DeleteSysMenu :execrows
DELETE
FROM sys_menus
WHERE id = $1;
-- name: CreateSysMenuPermission :exec
INSERT INTO sys_menu_permission (menu_id, permission_id)
VALUES ($1, $2);
-- name: DeleteSysMenuPermission :exec
DELETE
FROM sys_menu_permission
WHERE menu_id = $1;
-- name: DeleteSysPermissionByMenuID :exec
DELETE
FROM sys_permissions
WHERE id IN (SELECT permission_id
FROM sys_menu_permission
WHERE menu_id = $1);
-- name: UpdateSysMenuPermissionCode :exec
UPDATE sys_permissions p
SET code = coalesce(sqlc.narg('code'), code)
FROM sys_menu_permission mp
WHERE p.id = mp.permission_id
AND mp.menu_id = $1;

View File

@@ -0,0 +1,14 @@
-- name: CreateSysPermission :one
INSERT INTO sys_permissions(type,code)
VALUES ($1,$2) RETURNING id;
-- name: UpdateSysPermission :exec
UPDATE sys_permissions
SET code = $2
WHERE id = $1;
-- name: DeleteSysPermission :exec
DELETE
FROM sys_permissions
WHERE id = $1;

View File

@@ -0,0 +1,76 @@
-- name: CreateSysRole :exec
INSERT INTO sys_roles (name, code)
VALUES ($1, $2);
-- name: ListSysRoles :many
SELECT *
FROM sys_roles
ORDER BY id
LIMIT $1 OFFSET $2;
-- name: CountSysRoles :one
SELECT COUNT(*)
FROM sys_roles;
-- name: GetSysRoleByID :one
SELECT *
FROM sys_roles
WHERE id = $1;
-- name: ExistsSysRoleCode :one
SELECT EXISTS(SELECT 1
FROM sys_roles
WHERE code = sqlc.arg(code)
AND (
sqlc.narg(id)::integer IS NULL
OR id <> sqlc.narg(id)::integer
));
-- name: UpdateSysRole :execrows
UPDATE sys_roles
SET name = coalesce(sqlc.narg('name'), name)
WHERE id = sqlc.arg('id');
-- name: DeleteSysRole :execrows
DELETE
FROM sys_roles
WHERE id = $1;
-- name: CreateSysRolePermission :copyfrom
INSERT INTO sys_role_permission (role_id, permission_id)
VALUES ($1, $2);
-- name: GetSysPermissionIdsByMenuIDs :many
SELECT permission_id
FROM sys_menu_permission
WHERE menu_id = ANY ($1::int[]);
-- name: GetSysPermissionIdsByApiIDs :many
SELECT permission_id
FROM sys_api_permission
WHERE api_id = ANY ($1::int[]);
-- name: GetAllSysRoles :many
SELECT *
from sys_roles;
-- name: GetSysRoleMenus :many
SELECT m.id, m.name
FROM sys_role_permission rp
JOIN sys_menu_permission mp ON mp.permission_id = rp.permission_id
JOIN sys_menus m ON m.id = mp.menu_id
WHERE rp.role_id = $1;
-- name: GetSysRoleApis :many
SELECT a.id, a."name"
FROM sys_role_permission rp
JOIN sys_api_permission ap ON ap.permission_id = rp.permission_id
JOIN sys_apis a ON a.id = ap.api_id
WHERE rp.role_id = $1;
-- name: DeleteSysRolePermission :exec
DELETE
FROM sys_role_permission rp USING sys_permissions p
WHERE rp.permission_id = p.id
AND p."type" = $2
AND rp.role_id = $1;

View File

@@ -0,0 +1,107 @@
-- name: CreateSysUser :exec
INSERT INTO sys_users (account, username, password_hash, avatar_id)
VALUES ($1, $2, $3, $4);
-- name: GetSysUserByID :one
SELECT u.id,
u.account,
u.username,
u.avatar_id,
f.file_path AS avatar_url,
u.created_at,
u.updated_at
FROM sys_users u
LEFT JOIN files f ON u.avatar_id = f.id
WHERE u.id = $1;
-- name: GetSysUserByAccount :one
SELECT u.id,
u.account,
u.username,
u.password_hash,
u.avatar_id,
f.file_path AS avatar_url,
u.created_at,
u.updated_at
FROM sys_users u
LEFT JOIN files f ON u.avatar_id = f.id
WHERE u.account = $1;
-- name: ListSysUsers :many
SELECT u.id,
u.account,
u.username,
u.avatar_id,
f.file_path AS avatar_url,
u.created_at,
u.updated_at
FROM sys_users u
LEFT JOIN files f ON u.avatar_id = f.id
ORDER BY u.id
LIMIT $1 OFFSET $2;
-- name: CountSysUsers :one
SELECT COUNT(*)
FROM sys_users;
-- name: UpdateSysUser :execrows
UPDATE sys_users
SET username = coalesce(sqlc.narg('username'), username),
avatar_id = CASE WHEN @update_avatar_id::boolean THEN @avatar_id ELSE avatar_id END
WHERE id = sqlc.arg('id');
-- name: UpdateSysUserPassword :execrows
UPDATE sys_users
SET password_hash = $2
WHERE id = $1;
-- name: DeleteSysUser :execrows
DELETE
FROM sys_users
WHERE id = $1
AND id <> 1;
-- name: ClearSysUserRoles :exec
DELETE
FROM sys_user_role
WHERE user_id = $1;
-- name: CreateSysUserRole :exec
INSERT INTO sys_user_role (user_id, role_id)
VALUES ($1, $2);
-- name: GetSysUserRoles :many
SELECT r.*
FROM sys_roles r
JOIN sys_user_role ur ON r.id = ur.role_id
WHERE ur.user_id = $1;
-- name: GetSysAdminMenus :many
SELECT *
FROM sys_menus
ORDER BY sort, id;
-- name: GetSysUserMenus :many
SELECT DISTINCT m.*
FROM sys_users u
JOIN sys_user_role ur ON ur.user_id = u.id
JOIN sys_roles r ON r.id = ur.role_id
JOIN sys_role_permission rp ON rp.role_id = r.id
JOIN sys_permissions p ON p.id = rp.permission_id
JOIN sys_menu_permission mp ON mp.permission_id = p.id
JOIN sys_menus m ON m.id = mp.menu_id
WHERE u.id = $1
ORDER BY m.sort, m.id;
-- name: GetSysUserApis :many
SELECT DISTINCT a.id,
a.PATH,
a.METHOD
FROM sys_users u
JOIN sys_user_role ur ON u.id = ur.user_id
JOIN sys_role_permission rp ON rp.role_id = ur.role_id
JOIN sys_permissions p ON p.id = rp.permission_id
AND p.TYPE = 1
JOIN sys_api_permission ap ON ap.permission_id = p.id
JOIN sys_apis a ON a.id = ap.api_id
WHERE u.id = $1;