feat: release v1.0.0

This commit is contained in:
2026-07-29 22:10:36 +08:00
parent ee9f50b859
commit c903b5a6b5
81 changed files with 2776 additions and 1044 deletions

View File

@@ -1,12 +1,12 @@
-- name: CreateCategory :exec
INSERT INTO categories(name, code)
VALUES ($1, $2);
INSERT INTO categories(name, code, sort)
VALUES ($1, $2, $3);
-- name: ListCategories :many
SELECT *
FROM categories
ORDER BY id LIMIT $1
OFFSET $2;
ORDER BY sort DESC, id
LIMIT $1 OFFSET $2;
-- name: CountCategories :one
SELECT COUNT(*)
@@ -14,17 +14,14 @@ FROM categories;
-- name: ListAllCategories :many
SELECT *
FROM categories;
-- name: GetCategoryById :one
SELECT *
FROM categories
WHERE id = $1;
ORDER BY sort DESC, id;
-- name: UpdateCategory :execrows
UPDATE categories
SET name = coalesce(sqlc.narg('name'), name),
code = coalesce(sqlc.narg('code'), code)
code = coalesce(sqlc.narg('code'), code),
sort = coalesce(sqlc.narg('sort'), sort)
WHERE id = sqlc.arg('id');
-- name: DeleteCategory :execrows
@@ -36,7 +33,12 @@ WHERE id = $1;
INSERT INTO post_category(post_id, category_id)
VALUES ($1, $2);
-- name: DeletePostCategory :exec
-- name: DeletePostCategoryByPostID :exec
DELETE
FROM post_category
WHERE post_id = $1;
WHERE post_id = $1;
-- name: DeletePostCategoryByCategoryID :exec
DELETE
FROM post_category
WHERE category_id = $1;

View File

@@ -18,18 +18,46 @@ WITH paginated_posts AS (
updated_at
FROM posts
ORDER BY sort DESC, published_at DESC, id DESC
LIMIT $1 OFFSET $2)
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
COALESCE(ps.view, 0) AS view,
COALESCE(
jsonb_agg(
jsonb_build_object(
'id', t.id,
'name', t.name,
'code', t.code
)
ORDER BY t.sort DESC, t.id
) FILTER (WHERE t.id IS NOT NULL),
'[]'::jsonb
) AS tags
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
LEFT JOIN post_tag pt ON pt.post_id = p.id
LEFT JOIN tags t ON t.id = pt.tag_id
GROUP BY p.id,
p.title,
p.cover_id,
p.slug,
p.summary,
p.status,
p.sort,
p.published_at,
p.created_at,
p.updated_at,
f.file_path,
c.name,
c.id,
ps.view
ORDER BY p.sort DESC, p.published_at DESC, p.id DESC;
-- name: CountPosts :one
@@ -40,12 +68,21 @@ FROM posts;
SELECT p.*,
f.file_path AS cover,
c.name AS category_name,
c.id AS category_id
c.id AS category_id,
COALESCE(
array_agg(pt.tag_id ORDER BY pt.tag_id) FILTER (WHERE pt.tag_id IS NOT NULL),
ARRAY[]::integer[]
) AS tags
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
LEFT JOIN post_tag pt ON pt.post_id = p.id
WHERE p.id = $1
GROUP BY p.id,
f.file_path,
c.name,
c.id
LIMIT 1;
-- name: UpdatePost :execrows
@@ -98,12 +135,36 @@ SELECT p.*,
f.file_path AS cover,
c.name AS category_name,
c.id AS category_id,
COALESCE(ps.view, 0) AS view
COALESCE(ps.view, 0) AS view,
COALESCE(
jsonb_agg(
jsonb_build_object(
'id', t.id,
'name', t.name,
'code', t.code
)
ORDER BY t.sort DESC, t.id
) FILTER (WHERE t.id IS NOT NULL),
'[]'::jsonb
) AS tags
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
LEFT JOIN post_tag pt ON pt.post_id = p.id
LEFT JOIN tags t ON t.id = pt.tag_id
GROUP BY p.id,
p.title,
p.cover_id,
p.slug,
p.summary,
p.sort,
p.published_at,
f.file_path,
c.name,
c.id,
ps.view
ORDER BY p.sort DESC, p.published_at DESC, p.id DESC;
-- name: CountPublishedPosts :one
@@ -142,4 +203,6 @@ FROM
AND p.published_at < NOW()
GROUP BY
c.id,
c.name;
c.sort,
c.name
ORDER BY c.sort DESC, c.id;

View File

@@ -6,12 +6,16 @@ RETURNING id;
-- name: GetSysApis :many
SELECT *
FROM sys_apis
WHERE (sqlc.arg('group_name')::text = '' OR group_name ILIKE '%' || sqlc.arg('group_name') || '%')
AND (sqlc.arg('method')::text = '' OR method = sqlc.arg('method'))
ORDER BY id
LIMIT $1 OFFSET $2;
-- name: CountSysApis :one
SELECT COUNT(*)
FROM sys_apis;
FROM sys_apis
WHERE (sqlc.arg('group_name')::text = '' OR group_name ILIKE '%' || sqlc.arg('group_name') || '%')
AND (sqlc.arg('method')::text = '' OR method = sqlc.arg('method'));
-- name: GetSysApiByID :one
SELECT *
@@ -41,13 +45,6 @@ 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;

View File

@@ -38,7 +38,7 @@ SET name = coalesce(sqlc.narg('name'), name),
hidden = coalesce(sqlc.narg('hidden'), hidden),
sort = coalesce(sqlc.narg('sort'), sort),
status = coalesce(sqlc.narg('status'), status),
icon = coalesce(sqlc.narg('icon'), status),
icon = CASE WHEN @update_icon::boolean THEN @icon ELSE icon END,
parent_id = CASE WHEN @update_parent_id::boolean THEN @parent_id ELSE parent_id END
WHERE id = sqlc.arg('id');

View File

@@ -12,3 +12,12 @@ DELETE
FROM sys_permissions
WHERE id = $1;
-- name: GetSysPermissionIDBySysApiID :one
SELECT permission_id
FROM sys_api_permission
WHERE api_id = $1;
-- name: GetSysPermissionIDBySysMenuID :one
SELECT permission_id
FROM sys_menu_permission
WHERE menu_id = $1;

View File

@@ -1,6 +1,6 @@
-- name: CreateSysRole :exec
INSERT INTO sys_roles (name, code)
VALUES ($1, $2);
INSERT INTO sys_roles (name, code, status)
VALUES ($1, $2, $3);
-- name: ListSysRoles :many
SELECT *
@@ -28,7 +28,8 @@ SELECT EXISTS(SELECT 1
-- name: UpdateSysRole :execrows
UPDATE sys_roles
SET name = coalesce(sqlc.narg('name'), name)
SET name = coalesce(sqlc.narg('name'), name),
status = coalesce(sqlc.narg('status'), status)
WHERE id = sqlc.arg('id');
-- name: DeleteSysRole :execrows
@@ -68,9 +69,24 @@ FROM sys_role_permission rp
JOIN sys_apis a ON a.id = ap.api_id
WHERE rp.role_id = $1;
-- name: DeleteSysRolePermission :exec
-- name: DeleteSysRolePermissionByType :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;
AND rp.role_id = $1
AND p."type" = $2;
-- name: DeleteSysRolePermissionByRoleID :exec
DELETE
FROM sys_role_permission
WHERE role_id = $1;
-- name: DeleteSysRolePermissionByPermissionID :exec
DELETE
FROM sys_role_permission
WHERE permission_id = $1;
-- name: DeleteSysUserRoleByRoleID :exec
DELETE
FROM sys_user_role
WHERE role_id = $1;

View File

@@ -1,12 +1,20 @@
-- name: CreateSysUser :exec
INSERT INTO sys_users (account, username, password_hash, avatar_id)
VALUES ($1, $2, $3, $4);
INSERT INTO sys_users (account, username, password_hash, status, avatar_id)
VALUES ($1, $2, $3, $4, $5);
-- name: GetActiveSysUserByID :one
-- 场景:用户登录、获取个人信息、刷新 Token严格校验 status = 1
SELECT id, account, username, status
FROM sys_users
WHERE id = $1
AND status = 1;
-- name: GetSysUserByID :one
SELECT u.id,
u.account,
u.username,
u.avatar_id,
u.status,
f.file_path AS avatar_url,
u.created_at,
u.updated_at
@@ -19,6 +27,7 @@ SELECT u.id,
u.account,
u.username,
u.password_hash,
u.status,
u.avatar_id,
f.file_path AS avatar_url,
u.created_at,
@@ -31,22 +40,26 @@ WHERE u.account = $1;
SELECT u.id,
u.account,
u.username,
u.status,
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 (sqlc.arg('username')::text = '' OR u.username ILIKE '%' || sqlc.arg('username') || '%')
ORDER BY u.id
LIMIT $1 OFFSET $2;
-- name: CountSysUsers :one
SELECT COUNT(*)
FROM sys_users;
FROM sys_users
WHERE (sqlc.arg('username')::text = '' OR username ILIKE '%' || sqlc.arg('username') || '%');
-- name: UpdateSysUser :execrows
UPDATE sys_users
SET username = coalesce(sqlc.narg('username'), username),
status = coalesce(sqlc.narg('status'), status),
avatar_id = CASE WHEN @update_avatar_id::boolean THEN @avatar_id ELSE avatar_id END
WHERE id = sqlc.arg('id');
@@ -66,7 +79,7 @@ DELETE
FROM sys_user_role
WHERE user_id = $1;
-- name: CreateSysUserRole :exec
-- name: CreateSysUserRole :copyfrom
INSERT INTO sys_user_role (user_id, role_id)
VALUES ($1, $2);
@@ -79,19 +92,44 @@ WHERE ur.user_id = $1;
-- name: GetSysAdminMenus :many
SELECT *
FROM sys_menus
WHERE status = 1
AND type <> 2
ORDER BY sort, id;
-- name: GetSysAdminPermissions :many
SELECT code
FROM sys_permissions
WHERE type = 0;
-- 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_menu_permission mp ON mp.permission_id = rp.permission_id
JOIN sys_menus m ON m.id = mp.menu_id
WHERE u.id = $1
AND u.status = 1
AND r.status = 1
AND m.status = 1
AND m.type <> 2
ORDER BY m.sort, m.id;
-- name: GetSysUserPermissions :many
SELECT DISTINCT p.code
FROM sys_users u
JOIN sys_user_role ur ON u.id = ur.user_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;
AND u.status = 1
AND r.status = 1
AND m.status = 1
AND p."type" = 0;
-- name: GetSysUserApis :many
SELECT DISTINCT a.id,
@@ -99,9 +137,10 @@ SELECT DISTINCT a.id,
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_roles r ON r.id = ur.role_id
JOIN sys_role_permission rp ON rp.role_id = r.id
JOIN sys_api_permission ap ON ap.permission_id = rp.permission_id
JOIN sys_apis a ON a.id = ap.api_id
WHERE u.id = $1;
WHERE u.id = $1
AND u.status = 1
AND r.status = 1;

View File

@@ -0,0 +1,44 @@
-- name: ListTags :many
SELECT *
FROM tags
ORDER BY sort DESC, id
LIMIT $1 OFFSET $2;
-- name: CountTags :one
SELECT COUNT(*)
FROM tags;
-- name: ListAllTags :many
SELECT *
FROM tags
ORDER BY sort DESC, id;
-- name: CreateTag :exec
INSERT INTO tags(name, code, sort)
VALUES ($1, $2, $3);
-- name: UpdateTag :execrows
UPDATE tags
SET name = coalesce(sqlc.narg('name'), name),
code = coalesce(sqlc.narg('code'), code),
sort = coalesce(sqlc.narg('sort'), sort)
WHERE id = sqlc.arg('id');
-- name: DeleteTag :execrows
DELETE
FROM tags
WHERE id = $1;
-- name: CreatePostTag :copyfrom
INSERT INTO post_tag(post_id, tag_id)
values ($1, $2);
-- name: DeletePostTagByPostID :exec
DELETE
FROM post_tag
WHERE post_id = $1;
-- name: DeletePostTagByTagID :exec
DELETE
FROM post_tag
WHERE tag_id = $1;